2013-05-11 71 views
0

嗨我是新来的斯卡拉和编程一般。我在coursera上学习了一个Scala课程,其中一个任务是创建函数,它将set作为参数并返回另一个set,它是2组的union/intersection/difference。这是交叉点的解决方案:这个代码示例中scala如何推断类型?

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

我不明白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

仔细看看'Set'的定义,你应该能够弄清楚elem是什么。另外,如果你想要一个答案,你应该发布'Set'的定义(我只知道它,因为我接受了同一个类)。 – 2013-05-11 15:14:50

回答

1

从去年的斯卡拉类上coursera:

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) 

仅当您之前定义的类型SetInt => Boolean工作。

0

并联可以用过滤功能可以得出:

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

这里会发生什么情况是一样的。我们定义一个变量“elem”,并通过它的约束条件来定义它,即联合的s(elem)& & t(elem)。至于为什么它在命令行中不起作用,我相信一个“类型”是为Set定义的,而不是一个普通的Set。期待中的代码