我正在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
現在,我得到錯誤工會是不是成員設置
我正在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
現在,我得到錯誤工會是不是成員設置
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
的方法。
從我能記得的方式回到當我做這門課時,你不應該使用任何標準庫類型來建立你的解決方案。所以你不應該使用標準庫中的Set[T]
。在收集庫中,union
已定義並按預期工作。
但是,該課程要求您爲Set
定義自己的類型,我相信它是Int => Boolean
。
你真正需要的是這樣的函數:
type Set = Int => Boolean
def union (s1 : Set, s2 : Set) : Set = (x:Int) => s1(x) || s2(x)
也就是說,你需要定義一個拉姆達。
謝謝。其實@kpbochenek提到更準確,但你連接他的解決方案後的鏈接,所以我給你也+1 – Tahseen
你已經有了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]
謝謝。我認爲我需要澄清我的問題,並且你的回答是正確的 – Tahseen
當你做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有它。
是不是類型只是別名集[Int]? – Tahseen
@DarkStar不,它創建一個名爲'Set'的新類型,它與標準庫類Set'無關。新的'Set'類型是'Int => Boolean'的別名。這就是當你編寫'def union(s:Set,t:Set):Set'時,和寫'def union(s:Int => Boolean,t:Int => Boolean)相同:Int => Boolean' 。 – sepp2k
謝謝你說的正確。當我使用'Set = Int => Boolean'類型時,它創建了一個新的函數別名,它接受一個整數並返回一個布爾值。所以我也給你+1的澄清。謝謝 – Tahseen