2009-10-09 75 views

回答

44

那麼... 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) :)。