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

时间:2013-05-11 15:11:32

标签: scala

您好我是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 个答案:

答案 0 :(得分: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时才有效。

答案 1 :(得分:0)

可以使用过滤函数绘制并行:

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

这里发生的事情是一样的。我们定义一个变量“elem”,并通过它的约束来定义它(s(elem)&amp;&amp;工会的t(elem)。

至于为什么它在命令行中不起作用,我相信为Set定义了“type”而不是它是普通的Set。查看代码