我们有三个功能。第一个定义布尔条件的类型别名
type Set = Int => Boolean
我知道这是别名定义。现在是第二个功能
def contains(set: Set, elem: Int): Boolean = set(elem)
调用(Int=>Boolean)
上的elem:Int
。
Set
下函数的逻辑在哪里?我的意思是,在调用Set
时,我是否必须传递contains
函数实际参数(在这种情况下contains
是更高阶函数)。对于偶数集:
val in:Boolean = contains({x=>(x%2)==0},2)
在第三个功能中:
def singletonSet(elem: Int): Set = set => set == elem
set
在哪里形成?它不在正式参数列表中。答案 0 :(得分:6)
问题1:是的,您必须传递Set
,这将是该函数的“实现”。这个练习的重点(Odersky的课程?)是为了表明Set不能被定义为项目的集合(集合的“通常”定义),而是作为一个函数来说明项目是否包含在是否设定。所以 Set 函数。
问题2: set
是我们在这里返回的匿名函数的参数的名称:因为singletonSet
的返回类型是{{1} },正如我们所说的实际上是类型Set
的函数,我们返回一个(匿名)函数。要创建这样的函数,可以使用语法Int => Boolean
,其中x => f(x)
是您想要的任何名称,x
是使用它的表达式(或不是)。
答案 1 :(得分:2)
1)由于Set
是一个函数,contains
确实是一个高阶函数,它接受一个函数和一个适当类型的元素,并将该函数应用于该元素。它的逻辑是集合由布尔值函数表示,其中元素当且仅当它在相应的集合中时才计算为true
。函数contains
计算元素的函数并返回其值,该值为true
或false
,具体取决于它是否在集合中。
2)singleton
返回一个匿名函数,当且仅当输入(true
)等于所讨论的元素时,该函数的计算结果为set
。