2012-02-19 83 views
5

所以,如果你想寫出一行在F#控制檯,請執行以下操作:匿名函數和F#重載方法

System.Console.WriteLine "foo" 

原本我以爲下面是幾乎相同的,只是更冗長,但實際上它給出了錯誤「爲方法‘的WriteLine’A獨特超載無法確定基於在此之前程序點類型信息」:

(fun line -> System.Console.WriteLine line) "foo" 

看來第二版本是由存在混淆重載的WriteLine方法需要一個字符串以及其他參數。我的假設是否正確?

回答

12

不完全。在第一種情況下,函數調用知道它被應用於字符串文字,因此它可以通過重載解析來查找字符串重載。

在第二種情況下,line是一個未解決的類型變量在該呼叫到重載WriteLine方法的指向類型推斷,所以它不知道哪個過載來接,並且它沒有看到字符串參數但是,類型推斷是從左到右的。

將其更改爲

"foo" |> (fun line -> System.Console.WriteLine line) 

,它會工作,因爲line的類型推斷變量將string從「富」在未來得到統一,之前,需要確定WriteLine電話。

所以他們的關鍵是從左到右的類型推斷;在沒有對類型變量的解決方案的情況下,可能無法選擇過載。