我刚刚开始学习Martin Odesky的Coursera课程中的scala。我真的在功能集问题上苦苦挣扎。我无法捕捉的是联合方法 -
object Functionalset {
type Set = Int => Boolean
def singletonSet(element: Int): Set = i => element == i
def union(a: Set, b: Set): Set = i => a(i) || b(i)
def main(args:Array[String]): Unit = {
print(singletonSet(2)(4));
}
}
在union方法中,我基本上返回一个函数,它接受Int i
并调用a(i) || b(i)
来检查i
是否在集合中。 apply
方法未在任何地方定义。 a(i)
做了什么?它会调用singletonSet(element:Int):Set
吗?如果是这样的话?
答案 0 :(得分:1)
在本实验中,一个集合被定义为characteristic function。 这转化为:
type Set = Int => Boolean
这意味着Set
只是一个函数接受Int
并返回Boolean
(这是Set的特征函数,一个oracle,它告诉给定的整数是否为在集合中或不)。
您的变量a
是Set
,是一个函数Int => Boolean
,因此如果a(i)
是i
,则Int
定义明确}。
两个联合的特征函数是一个函数,如果它的参数在两个集合之一中则返回true,否则返回false。
答案 1 :(得分:1)
a(i)做什么?它是否会调用
singletonSet(element: Int)
不,这两种方法之间没有关系。在这种特殊情况下,a(i)
只是调用函数a
,这是一个从Int
到Boolean
的函数。
a
属于Set
类型,是Int
到Boolean
(Int => Boolean
的函数的类型别名用Scala语法糖)。
这样想:
def union(a: Int => Boolean, b: Int => Boolean): Int => Boolean = i => a(i) || b(i)
由于a
是Function1[Int, Boolean]
类型的函数,因此b
是函数,因此调用a(i)
只是调用带有i
的传递值的函数。现在,可能令人困惑的是:
i => a(i) || b(i)
由于union
本身会返回函数,因此可能会传入的任何未来Int
需要占位符,这种情况发生在您致电singletonSet(2)(4)
,如果我们稍微贬低它,你有:
val intermidiateFunction: Int => Boolean = singletonSet(2)
val result: Boolean = intermidiateFunction(4)
将其视为方法的两步调用,当您执行第一次调用时,您将返回另一个函数,并且只有在第二次调用它时,才会返回结果生成的函数。
让我们调用union
,看看会发生什么:
scala> union(i => i < 3, i => i > 1)
res6: Set = <function1>
scala> val result = union(i => i < 3, i => i > 1)
result: Set = <function1>
scala> result(1)
res7: Boolean = true
union
要求我们传递两个函数,因此我们创建这些简化函数来检查Int
是否小于3或大于1.第一次调用的结果本身就是一个函数。当我们现在将Int
传递给结果时,例如:result(1)
,我们会检查1 < 3 || 1 > 1
,这相当于a(i) || b(i)
,其中a
1}}是第一个函数,b
是第二个函数。