2017-02-28 89 views
1

鑑於Scala的類型推斷,我期望下不失敗:爲什麼scala不能推斷部分應用函數中的類型?

scala> def partiallyApplied(x: Int, y: Int, z: Int) = x + y + z 
partiallyApplied: (x: Int, y: Int, z: Int)Int 

scala> val partialSum = partiallyApplied(2, 3, _) 
<console>:11: error: missing parameter type for expanded function ((x$1) => partiallyApplied(2, 3, x$1)) 
    val partialSum = partiallyApplied(2, 3, _) 
             ^

,當然還有,這個工程:

scala> val partialSum = partiallyApplied(2, 3, _:Int) 
partialSum: Int => Int = <function1> 

是否有一個原因,類型推斷不符合部分應用幫助在這種情況下的功能?

回答

1

Scala specification說正好在哪些情況下參數類型可以被省略,並且這不是它們中的一個:

如果預期的類型匿名函數的是形狀scala.FunctionN[S1,…,Sn, R]的,或者可以是SAM-轉換這樣的功能類型,類型的參數 xi 可以省略的 Ti ,只要 Si 在預期的類型被定義,並且 Ti = Si假設爲。此外,預期的類型時類型檢查eR

如果不存在預期類型的​​函數文本,所有的正式參數類型Ti 必須明確指定,並e 預期的類型是不確定的。類型匿名函數的是scala.FunctionN[T1,…,Tn, R],其中Re打包類型。 R必須等於其不指代任何形式參數xi的類型。

難道是改變在這種特殊情況下的工作呢?當然。這個改變值得嗎?可能不會。

相關問題