2013-10-30 97 views
0

我有問題。我通過它的characterisitc函數表示一個集合,所以我爲這個表示定義了一個類型別名。函數filterHead應該將一個集合和一個謂詞作爲輸入並返回函數f的結果。斯卡拉。設置爲功能

type Set = Int => Boolean 
def filterHead(s: Set, f: Int => Boolean): Boolean = f(s.head) 

然後以下錯誤occures: 「值頭不INT =>布爾的成員」。和錯誤有關。當你定義別名Set鍵入allias定義,而不是輸入函數f

+1

在上面的代碼片段中,'s:Set'本質上是':Int => Boolean',因爲你已經爲'Set'定義了一個別名。這不是指'集合'集,所以沒有'頭'開頭... –

+0

,但工作表給出了這個輸出 'val set = Set(1,2,3)' 'set.head //> res2:Int = 1' –

回答

1

,該Set參數將被「展開」到全類型:

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

scala> def foo(s : Set, i : Int) = ??? 
foo: (s: Int => Boolean, i: Int)Nothing 

當你」重新使用Set(1,2,3),您使用的同伴對象的apply方法,它返回一個不同的類型:

scala> val set = Set(4,1,2) 
set: scala.collection.immutable.Set[Int] = Set(4, 1, 2) 

而且,你可能會注意到,收集集合是通用在這裏。儘管(別名是Set[T]),你也可以創建一個通用類型別名,所以仍然可能存在一些混淆。

解決方案?使用一個完整的類型名稱:

scala> def filterHead(s : scala.collection.immutable.Set[Int], setFunc : Set) = setFunc(s.head) 
filterHead: (s: scala.collection.immutable.Set[Int], setFunc: Int => Boolean)Boolean 

或者給你的別名不同的名稱:

type SetFunc = Int => Boolean 

,或者在一個通用的方法:

type SetFunc[T] = T => Boolean 

甚至導入scala.collection.immutable.Set[T]下一個不同名稱 - 導入時的別名。