2013-05-11 22 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。期待中的代碼