2015-06-30 56 views
3

下面的代碼片段是從Twitter的Scala的學校:斯卡拉秩1多態性

Scala有秩1多態性。粗略地說,這意味着你想在Scala中表達一些類型概念,這對編譯器來說太「通用」了。假設你有一些功能:

def toList[A](a: A) = List(a) 

您希望使用一般:

def foo[A, B](f: A => List[A], b: B) = f(b) 

這不能編譯,因爲所有類型的變量必須固定在調用現場。即使你「敲定」 B類型,

def foo[A](f: A => List[A], i: Int) = f(i) // Line 1 

...你會得到一個類型不匹配。

爲什麼第1行會失敗? B的類型是已知的。爲什麼這個編譯失敗?

回答

5
scala> def toList[A](a:A) = List(a) 
toList: [A](a: A)List[A] 

scala> def foo[A, B](f: A => List[A], b: B) = f(b) 
<console>:10: error: type mismatch; 
found : b.type (with underlying type B) 
required: A 
     def foo[A, B](f: A => List[A], b: B) = f(b) 

此行不會編譯,因爲你逝去的B類型的值時,該函數需要A類型的值。

def foo[A](f: A => List[A], i: Int) = f(i) // Line 1 

對於此行,你需要提供從Int類型的隱式轉換鍵入A