2016-08-15 87 views
1

我正在Coursera作業和第2周工作。本週的任務並不艱難,但很混亂。斯卡拉「類型」別名混淆

我寫了下面的代碼,它工作正常

def union(s:Set[Int], t:Set[Int]):Set[Int] = s union t 

但是,如果使用類型來創建集的別名,上述改寫爲

type Set = Int => Boolean 
def union(s:Set, t:Set):Set = s union t 

現在,我得到錯誤工會是不是成員設置

回答

6
def union(s:Set[Int], t:Set[Int]):Set[Int] = s union t 

的這工作,因爲Set[T]定義了一個名爲功能,在上面的代碼中調用。

type Set = Int => Boolean 
def union(s:Set, t:Set):Set = s union t 

這不起作用,因爲函數沒有名爲union的方法。

+0

是不是類型只是別名集[Int]? – Tahseen

+0

@DarkStar不,它創建一個名爲'Set'的新類型,它與標準庫類Set'無關。新的'Set'類型是'Int => Boolean'的別名。這就是當你編寫'def union(s:Set,t:Set):Set'時,和寫'def union(s:Int => Boolean,t:Int => Boolean)相同:Int => Boolean' 。 – sepp2k

+0

謝謝你說的正確。當我使用'Set = Int => Boolean'類型時,它創建了一個新的函數別名,它接受一個整數並返回一個布爾值。所以我也給你+1的澄清。謝謝 – Tahseen

4

從我能記得的方式回到當我做這門課時,你不應該使用任何標準庫類型來建立你的解決方案。所以你不應該使用標準庫中的Set[T]。在收集庫中,union已定義並按預期工作。

但是,該課程要求您爲Set定義自己的類型,我相信它是Int => Boolean

你真正需要的是這樣的函數:

type Set = Int => Boolean 
def union (s1 : Set, s2 : Set) : Set = (x:Int) => s1(x) || s2(x) 

也就是說,你需要定義一個拉姆達。

+0

謝謝。其實@kpbochenek提到更準確,但你連接他的解決方案後的鏈接,所以我給你也+1 – Tahseen

1

你已經有了union函數在scala中。您可以通過做在REPL驗證:

> val x: Set[Int] = Set(1,2,3) 
> x.union(Set(3, 4, 5)) 
res0: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4) 

比方說,你要定義自己的函數做同樣的事情,你可以這樣寫:

​​

這是通用的方法(只像集),你可以把它叫做:

> myunion(Set(1, 2, 3), Set(3, 4, 5)) 
//but it also works for other types: 
> myunion(Set('a', 'b', 'c'), Set('c', 'd', 'e')) 

別名類型稍有不同的語法完成:

type SetInt = Set[Int] 
type SetChar = Set[Char] 
+0

謝謝。我認爲我需要澄清我的問題,並且你的回答是正確的 – Tahseen

1

當你做type Set = Int => Boolean,你創建Function1類型。 你可以在scala repl中自己檢查一下;

scala> type Set = Int => Boolean 
defined type alias Set 

scala> val test: Set = i => true 
test: Set = <function1> 

正如你在Function1[-T1, +R]特質看到延伸AnyRef不具有union方法,但Set有它。