您好我是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
答案 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。查看代码