0

嗨,我是 Scala 和一般编程的新手。我在 coursera 上学习了 Scala 课程,其中一项任务是创建将集合作为参数并返回另一个集合的函数,该集合是 2 个集合的并集/交集/差集。以下是交叉路口的解决方案:

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 集

可变集合的通用特征。

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

实现说明:此 trait 提供了 Set 的大部分操作,与它的表示无关。它通常由集合的具体实现继承。

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

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

2 回答 2

1

来自去年 Coursera 上的 scala 课程:

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

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

你给的例子:

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

仅当您SetInt => Boolean以前一样定义了类型时才有效。

于 2013-05-11T21:38:32.737 回答
0

可以使用过滤器功能绘制平行线:

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

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

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

于 2013-05-11T15:25:51.143 回答