Scala中函数类型的类型别名[关闭]

Posted

技术标签:

【中文标题】Scala中函数类型的类型别名[关闭]【英文标题】:Type Alias for Function Types in Scala [closed] 【发布时间】:2021-11-06 11:48:17 【问题描述】:

我是 Scala 语言的新人,但我无法理解 type Set = Int => Boolean 的工作原理。我知道这是与布尔值转换的整数。我有def map(s: Set, f: Int => Int): Set = y => exists(s, x => y == f(x)) 存在def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, i => !p(i))) 和

def forall(s: Set, p: Int => Boolean): Boolean = 
    def iter(a: Int): Boolean = 
      if (a > bound) true
      else if (diff(s,p)(a)) false
      else iter(a + 1)
    
    iter(-bound)
  

这两个函数我理解,但是map 函数我有问题。如果我称它为 map(Set(2,3,5), i => i * 20),我只是不明白它是如何显示答案的。我得到40,60,100。我试图理解它,我知道xs 中的每个元素,f(x) 是 x 元素,乘以 20。y 的范围从 -1000 到 1000 (bound = 1000)。我读这个函数是这样的:y is range -1000..1000 in exists function is getting our Set(2,3,5) and after it give somthing with Boolean type.我如何得到像40,60,100 这样的答案。新系列是如何在那里创建的?

完整代码->

  type Set = Int => Boolean

  def contains(s: Set, elem: Int): Boolean = s(elem)
  def diff(s: Set, t: Set): Set = (i: Int)  => s(i) && !t(i)

  val bound = 1000

  def forall(s: Set, p: Int => Boolean): Boolean = 
    def iter(a: Int): Boolean = 
      if (a > bound) true
      else if (diff(s,p)(a)) false
      else iter(a + 1)
    
    iter(-bound)
  

  def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, x => !p(x))
  def map(s: Set, f: Int => Int): Set = y => exists(s, x => y == f(x))

  def toString(s: Set): String = 
    val xs = for (i <- -bound to bound if contains(s, i)) yield i
    xs.mkString("", ",", "")
  

  println(toString(map(Set(2, 3, 5), (i: Int) => i * 20)))

【问题讨论】:

【参考方案1】:

鉴于map() 实现...

y => exists(s, x => y == f(x))

...和调用...

map(Set(2,3,5), (i: Int) => i * 20)

...做一些替换,你会得到:

val mappedSet = y => exists(Set(2,3,5), x => y == x*20)

SetInt =&gt; Boolean(一个接受 Int 并返回 truefalse 的函数),mappedSet 是一个要求:

给定一个数字y,在 + 边界内是否存在一个既通过(是)Set(2,3,5) 并且当乘以 20 时等于 y 的数字?

mappedSet(60) 返回 true,因为在 + 边界内确实存在一个数字 3,它既是 Set(2,3,5) 的成员,又是相乘时乘以 20,等于 60

mappedSet(80) 返回 false,因为找不到通过这两个测试的数字。

【讨论】:

我明白了,非常感谢 :) 也许你可以给我推荐一些书籍或网站,让我可以更多地学习这种语言和这种情况?

以上是关于Scala中函数类型的类型别名[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

23.scala的自类型

如何在 Dart 中使用类型别名/类型定义(也是非函数)?

Dart 中的函数类型定义/函数类型别名是啥?

如何创建引用特定函数的函数类型的类型别名

Scala中输入函数参数的类型约束

使用typedef给函数指针类型一个别名