我已经接受了马丁·奥德斯基在课程中的scala中的函数式编程课程。
但是,我无法理解第二个Assignment Funsets.scala的解决方案。
type Set = Int => Boolean
/**
* Indicates whether a set contains a given element.
*/
def contains(s: Set, elem: Int): Boolean = s(elem)
/**
* Returns the union of the two given sets,
* the sets of all elements that are in either `s` or `t`.
*/
def union(s: Set, t: Set): Set = (e: Int) => s(e) || t(e)
问题在上面的功能中,什么是e ?它从何而来 ?我知道union函数结合了两个集合,但是我从方法定义中理解的是它需要2个集合作为输入并返回结果集合,那么 e 来自哪里?< / p>
/**
* Returns the intersection of the two given sets,
* the set of all elements that are both in `s` or `t`.
*/
def intersect(s: Set, t: Set): Set = (e: Int) => s(e) && t(e)
同样的问题适用于交叉函数。
请任何人解释一下上述两个函数的操作,即这两个陈述
(e: Int) => s(e) || t(e)
和(e: Int) => s(e) && t(e)
答案 0 :(得分:2)
def union(s: Set, t: Set): Set = (e: Int) => s(e) || t(e)
让我们把它分解成小块。
def union()
我正在定义一种方法,我会调用union
。(s: Set, t: Set)
此方法将采用我称之为s
和t
的2个参数,类型为Set
。: Set
此方法将返回类型Set
的值。坚持......什么是Set
?type Set = Int => Boolean
啊,好的,Set
是一个以Int
为参数并返回Boolean
的函数。得到它了。返回union()
方法。(e: Int) => s(e) || t(e)
这是一个采用Int
类型的单个参数的函数。我打算调用该参数e
。当此功能收到Int
时,它将被同时提供给s
和t
。 s
和t
都是Set
类型,这意味着在投放Int
时,它们会返回Boolean
。那么我们就会有2 Boolean
个值,他们会一起生成一个Boolean
,它与Set
的定义相匹配( Int
in Boolean
,所以我们已经完成了。现在让我们创建一个示例,看看如何使用它。
val setA:Set = x => x == 5 //this Set is true only for 5
val setB:Set = y => y == 2 //this Set is true only for 2
val setU = union(setA, setB) //setA is parameter s, setB is parameter t
setU(2) //'e' is now 2, this returns true
setU(5) //'e' is now 5, this returns true
setU(25) //'e' is now 25, this returns false
答案 1 :(得分:1)
如视频讲座中所述,我们应该将一个匿名函数分配给基本函数。
在这里,(x:Int)不是从某处带来的,请将其视为其他函数的函数参数。 例如:
def num(s: FunSet): FunSet = (x: Int) => x
this is similar to,
def function(x: Int) = x
def num(s: FunSet): FunSet = function
我希望这对将来的学习者有帮助...!我也有这个疑问...
答案 2 :(得分:0)
e
被称为参数。当函数应用于参数时,参数将绑定到参数。
例如,在函数
中val f: Int ⇒ Int = i ⇒ i + 1
i
是一个参数。如果将f
引用的函数应用于参数,比如2
,那么在函数内部,i
绑定到参数的值,即在函数内部,取消引用{ {1}}评估为i
。因此,应用2
引用的函数将评估为f
:
3
答案 3 :(得分:0)
请记住在此作业中如何定义Set
:它只是一个采用Int
并返回Boolean
的函数。将Int
传递给此函数时,如果Int
位于Set
,则函数返回true,否则返回false。换句话说,这种类型的Set
实际上并不是一个集合,而是对给定Set
中某些内容的含义的定义。
现在,在两个union
之间调用Set
会怎么做?那么它产生Set
,其成员至少在这两个Set
中的一个中。请记住,Set
只是Int => Boolean
函数,因此:
(e: Int) => s(e) || t(e)
是一个函数,它接受一些Int
参数,称之为e
,如果E s(e)
为真,则返回true或t(e)
为真。根据{{1}}方法声明,union
和s
是什么?
t
def union(s: Set, t: Set):
是描述s
是否在Int
Set
内的FUNCTION;同样适用于s
。因此,t
表示s(e) || t(e)
必须位于e
个中的一个或两个中,因为两个Set
中的union
才能返回true - 这正是Set
的定义是什么。