【问题标题】:Unsure how this union function on Sets works不确定 Sets 上的联合函数是如何工作的
【发布时间】:2012-10-02 13:44:26
【问题描述】:

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

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

问题中提到的是:Scala set function

这是我的理解:

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

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

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

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

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

【问题讨论】:

  • i 是 Int 类型,集合可以看作一个谓词。这有帮助吗?

标签: scala scala-collections


【解决方案1】:

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

type Set = (Int => Boolean)

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

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

union 方法的主体创建了一个从IntBoolean 的匿名函数(这是我们定义的Set)。这个匿名函数接受一个参数i,一个Int,并返回true,当且仅当i在集合aa(i))或i在集合b(@ 987654339@)。

【讨论】:

    【解决方案2】:

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

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

    x => someOp(x)
    

    如果类型已知,则无需对其进行注释。因此,如果我们知道 r.h.s.是Int => Boolean,我们知道x是类型Int

    【讨论】:

      【解决方案3】:

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

      union(a: Set, b: Set): Set 的返回类型是一个函数。调用union时不执行声明a(i) || b(i)的代码;只有当你调用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和2。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-20
        • 1970-01-01
        • 2014-09-08
        • 2019-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多