2017-09-13 72 views
3

這種精細編譯:爲什麼用作默認參數的函數字面量需要參數類型?

def walk[X](a: X)(f: X => Boolean): Boolean = f(a) 

walk(1)(_ => true) 

編譯沒有問題,以及:

def walk(a: Int)(f: Int => Boolean = _ => true): Boolean = f(a) 

walk(1)() 

這不:

def walk[X](a: X)(f: X => Boolean = _ => true): Boolean = f(a) 

walk(1)() 

的錯誤是:

Error:(1, 38) missing parameter type

明顯w^orkaround是使用(_: X) => true,但爲什麼這是一個錯誤?我雖然認爲當第二個參數列表正在處理時,從第一個參數獲得的類型信息應該已經可用了?

測試使用Scala 2.11.8和2.12.1

+0

哎呀我不小心刪除我的評論:) OK呀,我意識到了,但是請不要編輯它強調的問題(甚至更好,完全刪除這些行,問題是在定義中,不是調用) – slouc

回答

2

貌似this issue。請注意,這僅適用於默認參數;其他地方的推論工作得很好。

例如,

// works 
def walk1[X]: X => Boolean = _ => true 

// fails 
def walk2[X](f: X => Boolean = _ => true) = ??? 
相關問題