2014-06-05 45 views
3

我有下面的Scala代碼片段:爲什麼在Scala中調用這樣的函數?

type Set = Int => Boolean 

def contains(s: Set, element:Int): Boolean = s(element) 

def singletonSet(element: Int): Set = Set(element) 

val oneElementSet = singletonSet(5) 

contains(oneElementSet, 5) // true 
contains(oneElementSet, 6) // false 

我試圖環繞這是什麼一樣我的頭:集(元素)。看起來它會替換元素來代替Int參數,以產生此:5 =>布爾值。在任何地方都沒有比較,那麼爲什麼oneElementSet(5)返回true,而oneElementSet(6)返回false?

謝謝!

+2

您可以檢查定義了'singletonSet'返回的'Set'的完整包嗎?我想你只是使用'scala.collection.immutable'下的普通'Set',嘗試設置'type Set = Int => Int',如果你的代碼仍然有效,那麼你並沒有真正使用'Set'但是'scala.collection.immutable'下的一個。 – Peter

+0

這看起來像coursera FunProg。我會爲Set類型使用不同的名稱以避免與'scala.collection.immutable.Set'發生衝突。執行如下操作:'type MySet = Int => Boolean'並且它不應該工作。從練習的角度來看,單身套裝的impl是錯誤的。提示:應該使用函數定義來實現'singletonSet':Int => Boolean' – maasg

+0

這確實來自Coursera的'Scala語言功能編程'課程。感謝您的提示;) – MaxK

回答

2

Scala具有用於類型和值的單獨命名空間。您的類型別名定義了什麼Set在類型名稱空間中,但在singletonSet的定義Set來自值名稱空間,實際上它是伴隨對象scala.collection.immutable.SetSet(element)調用伴侶對象的apply方法,該方法返回scala.collection.immutable.Set[Int],結果是Int => Boolean的子類型,因此也是Set(您的類型別名)。

+0

是的,就是這樣。 'Set(element)'創建一個'scala.collection.immutable.Set [Int]'的實例。非常感謝大家幫助我! – MaxK

相關問題