首页 文章

scala如何在此代码示例中推断出类型?

提问于
浏览
0

嗨,我是Scala和编程的新手 . 我在课程上学习了Scala课程,其中一项任务是创建将集合作为参数的函数,并返回另一个集合,这是两个集合的联合/交集/差异 . 这是交集的解决方案:

def intersect(s: Set, t: Set): Set = elem => s(elem) && t(elem)

我不明白这个元素 . Scala如何知道它是集合的一个元素,为什么如果在shell中尝试它会返回错误:缺少参数类型 .

结合和差异的解决方案(相同):

def union(s: Set, t: Set): Set = elem => s(elem) || t(elem)

def diff(s: Set, t: Set): Set = elem => s(elem) && !t(elem)

来自Scala Set

可变集的一般特征 .

集合是不包含重复元素的集合 .

实施说明:该特征提供集合的大部分操作,与其表示无关 . 它通常由集合的具体实现继承 .

要实现具体集,您需要提供以下方法的实现:

def contains(key: A): Boolean
def iterator: Iterator[A]
def +(elem: A): This
def -(elem: A): This

2 回答

  • 1

    从去年的课程上的scala课程:

    object FunSets {
      /**
       * We represent a set by its characteristic function, i.e.
       * its `contains` predicate.
       */
      type Set = Int => Boolean
      // [...]
    }
    

    Set 不引用预定义的scala特征,而是引用 Int 作为参数并返回 Boolean 的函数 . 例如 . 包含单个元素的集合 {3} 由函数 f(Int) 表示,其中 f(3) 返回true, f(x)x != 3 返回false .

    你给出的例子:

    def intersect(s: Set, t: Set): Set = elem => s(elem) && t(elem)
    

    仅在您之前将类型 Set 定义为 Int => Boolean 时才有效 .

  • 0

    可以使用过滤功能绘制并行:

    List(1,2,4,5).filter(elem => elem < 4) = List(1, 2)
    

    这里发生的事情是一样的 . 我们定义一个变量“elem”,并通过其约束来定义它,即s(elem)&& t(elem)用于并集 .

    至于为什么它在命令行中不起作用,我认为“类型”是为Set定义的而不是普通的Set . 查看代码

相关问题