我正在尝试理解这种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)
答案 0 :(得分:12)
也许令人困惑的是语法。我们可以将其重写为:
type Set = (Int => Boolean)
def union(a: Set, b: Set): Set = {
(i: Int) => a(i) || b(i)
}
所以这可能更容易理清。我们正在定义一个方法union
,该方法转到Set
并返回一个新的Set
。在我们的实现中,Set
只是从Int
到Boolean
的函数的另一个名称(即,一个函数告诉我们参数是否在“集合中”)。
union
方法的正文创建了一个从Int
到Boolean
的匿名函数(我们已经定义了Set
)。此匿名函数接受参数i
,Int,并且仅当true
处于集i
(a
)OR {时才返回a(i)
{1}}已设置为i
(b
)。
答案 1 :(得分:1)
如果仔细观察,该问题会定义type Set = Int => Boolean
。所以我们这里不是在讨论scala.collection.Set
;我们正在谈论Int => Boolean
s。
要编写函数文字,请使用=>
关键字,例如
x => someOp(x)
如果已知类型,则无需注释该类型。所以,如果我们知道r.h.s.是Int => Boolean
,我们知道x
是Int
类型。
答案 2 :(得分:1)
for循环没有填充该集。
union(a: Set, b: Set): Set
的返回类型是一个函数。致电a(i) || b(i)
时,不会执行声明代码union
;它只会在您调用union
的结果时执行。
并且i
不是一个集合,它是一个整数。它是union
返回的函数的单个参数。
这里发生的是通过使用set
和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和。