不确定此集合上的联合函数如何工作

时间:2012-10-02 13:44:26

标签: scala scala-collections

我正在尝试理解这种def方法:

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

问题所指的是:Scala set function

这是我的理解:

该方法采用Set - a&类型的两个参数。 b 返回一个Set,两者的联合设置a&湾

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

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

由于'i'是一个Set,为什么它可能是'或一组',这是什么类似于在后台生成的东西:

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

3 个答案:

答案 0 :(得分:12)

也许令人困惑的是语法。我们可以将其重写为:

type Set = (Int => Boolean)

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

所以这可能更容易理清。我们正在定义一个方法union,该方法转到Set并返回一个新的Set。在我们的实现中,Set只是从IntBoolean的函数的另一个名称(即,一个函数告诉我们参数是否在“集合中”)。

union方法的正文创建了一个从IntBoolean的匿名函数(我们已经定义了Set)。此匿名函数接受参数i,Int,并且仅当true处于集ia)OR {时才返回a(i) {1}}已设置为ib)。

答案 1 :(得分:1)

如果仔细观察,该问题会定义type Set = Int => Boolean。所以我们这里不是在讨论scala.collection.Set;我们正在谈论Int => Boolean s。

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

x => someOp(x)

如果已知类型,则无需注释该类型。所以,如果我们知道r.h.s.是Int => Boolean,我们知道xInt类型。

答案 2 :(得分:1)

for循环没有填充该集。

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

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

这里发生的是通过使用setunion函数,您可以通过将它们与逻辑或运算符(||)组合来构造函数的二叉树。 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和。