从返回的Set
(只是一个函数)union
接受一些整数作为参数;您必须给它一个任意名称,以便您可以在函数体中引用它。如果您像这样编写函数可能更有意义:
def union(a: Set, b: Set): Set = {
(i) => a(i) || b(i)
}
如果你这样写它可能更有意义:
def union(a: Set, b: Set): Set = {
// The union of two sets is a new function that takes an Int...
def theUnion(i: Int): Boolean = {
// and returns true if EITEHR of the other functions are true
a(i) || b(i)
}
// Now we want to return the NEW function
theUnion
}
同样,i
是任意的,可以用任何变量替换:
def union(a: Set, b: Set): Set = item => a(item) || b(item)
[更新]
因为我们将集合表示为函数,所以不需要迭代来查看它们是否包含数字。例如,这是一个包含以下任意数字的集合-5
:
val belowNegFive: Set = (i) => i < -5
当我们用数字调用该函数时,它会告诉我们该数字是否在集合中。请注意,我们从未真正告诉它集合中的具体数字:
scala> belowNegFive(10)
res0: Boolean = false
scala> belowNegFive(-100)
res1: Boolean = true
scala> belowNegFive(-1)
res2: Boolean = false
这是另一个包含 和 之间的任意数字的50
集合100
:
val fiftyToHundred: Set = (i) => i >= 50 && i <= 100
scala> fiftyToHundred(50)
res3: Boolean = true
scala> fiftyToHundred(100)
res4: Boolean = true
scala> fiftyToHundred(75)
res5: Boolean = true
scala> fiftyToHundred(49)
res6: Boolean = false
现在,集合的并集belowNegFive
和fiftyToHundred
将包含任何低于或-5
介于和 之间50
的数字100
。我们可以通过返回一个新函数来轻松地在代码中表示这一点,如果其他两个函数中的任何一个返回 true,则该函数本身返回true。
scala> val unionOfBoth: Set = (i) => belowNegFive(i) || fiftyToHundred(i)
unionOfBoth: Int => Boolean = <function1>
scala> unionOfBoth(-10)
res7: Boolean = true
scala> unionOfBoth(50)
res8: Boolean = true
scala> unionOfBoth(0)
res9: Boolean = false
您问题中的union
函数只是将这种模式普遍应用于任何两组的一种方式。