1

我试图理解这个 def 方法:

def union(a: Set, b: Set): Set = i => a(i) || b(i)

问题中提到的是:Scala set function

这是我的理解:

该方法接受两个 Set 类型的参数 - a & b 返回一个 Set,它是两个集合 a & b 的并集。

这是我特别困惑的地方: Set = i => a(i) || 双)

返回的 Set 本身包含 Set a & b 的“或”。Set 'i' 是否由隐式 for 循环填充?

既然“我”是一个集合,为什么有可能或“一组集合”,这是否类似于在后台生成的内容:

a(i) || b(i) 
becomes
SetA(Set) || SetB(Set)
4

3 回答 3

12

也许让你感到困惑的是语法。我们可以将其重写为:

type Set = (Int => Boolean)

def union(a: Set, b: Set): Set = {
  (i: Int) => a(i) || b(i)
}

所以这可能更容易解决。我们正在定义一个union接受Sets 并返回一个 new的方法Set。在我们的实现中,Set它只是一个函数 from Intto的另一个名称Boolean(即,一个告诉我们参数是否在“集合中”的函数)。

union方法的主体创建了一个匿名函数 from Intto BooleanSet正如我们所定义的那样)。这个匿名函数接受一个参数i,一个 Int,并且true当且仅当i它在 set a( a(i)) 中或者i在 set b( b(i)) 中时才返回。

于 2012-10-02T14:11:37.367 回答
1

如果你仔细看,这个问题定义了一个type Set = Int => Boolean. 所以我们不是在这里谈论scala.collection.Set;我们在谈论Int => Booleans。

要编写函数文字,请使用=>关键字,例如

x => someOp(x)

如果类型已知,则无需注释该类型。所以如果我们知道 rhs 是Int => Boolean,我们就知道那x是 type Int

于 2012-10-02T14:11:59.823 回答
1

不,该集合不是由 for 循环填充的。

返回类型union(a: Set, b: Set): Set是一个函数。a(i) || b(i)调用时不执行声明的代码union;它只会在您调用union.

并且i不是一个集合,它是一个整数。它是由返回的函数的单个参数union

这里发生的是,通过使用setand函数,您可以通过将它们与逻辑或运算符 ( )union组合来构造函数的二叉树。||set函数使您可以构建叶子,并且union可以将它们组合成更大的函数树。

例子:

def set_one = set(1)
def set_two = set(2)
def set_three = set(2)
def set_one_or_two = union(set_one, set_two)
def set_one_two_three = union(set_three, set_one_or_two)

set_one_two_three将是一个包含两个节点的函数树:左边是检查传递的参数是否等于 3 的函数;右边是一个节点,它本身包含两个函数,分别检查参数是否等于 1 和 2。

于 2012-10-02T14:20:57.047 回答