25
a = List(1, 2, 3, 4)
def f(x : String) = { x }
確實
a.map(_.toString)
工作,但
a.map(f(_.toString))
給錯誤
missing parameter type for expanded function ((x$1) => x$1.toString)
a = List(1, 2, 3, 4)
def f(x : String) = { x }
確實
a.map(_.toString)
工作,但
a.map(f(_.toString))
給錯誤
missing parameter type for expanded function ((x$1) => x$1.toString)
那麼... f()
需要一個字符串作爲參數。構建體_.toString
的類型爲A <: Any => String
。功能f()
需要一種String
,因此上面的示例沒有鍵入檢查。看起來Scala在這種情況下很友善,給用戶另一個機會。錯誤信息的意思是:「通過我的類型推理算法,這不會編譯,把類型放進去,如果這是我無法推斷的東西。」
在這種情況下,您將不得不編寫匿名函數longhand,即a.map(n => f(n.toString))
。這不是對類型推斷的限制,而是通配符的限制。基本上,當您編寫a.map(f(_.toString))
時,_.toString
會擴展爲它可以找到的最接近的括號內的匿名函數,否則這會導致極大的含糊性。想像一下像f(g(_.toString))
。這是否意味着f(g(x => x.toString))
或f(x => g(x.toString))
?對於多個嵌套函數調用會產生更多的歧義。如上所述,Scala類型檢查器因此採用最合理的解決方案。
Nitpick:你的代碼的第一行應該是val a = List(1,2,3,4)
:)。