2010-12-19 79 views
4

以下工作正常,正如人們所期望的那樣,在Curry風格的多態類型系統中,例如,身份功能實際上就是功能的無限系列,每種類型「A - >」一:F#多態類型

let f x = x 
printfn "%A" (f 2) 
printfn "%A" (f 3.4) 

但是,當我們嘗試做一些稍微複雜一些,它不能在第三行,「這表達預計將有int類型,但是在這裏有float類型「:

let f x = string x 
printfn "%A" (f 2) 
printfn "%A" (f 3.4) 

(但註釋掉第二行使得三線工作,符合市場預期。)

先驗的,我本來期望類型推論要麼表現出未指定類型實際上是a的Curry風格通用的,或者只能鎖定一個版本的函數,但據我所知,它在第一種情況下執行前者,在第二種情況下執行後者。我猜測這種行爲背後有一些邏輯,我只是​​沒有理解。我錯過了什麼?

回答

6

這裏有一個非標準的事情與「帽子類型」進行。某些F#函數(如'string')具有基於靜態優化約束或存在某些成員函數的類型。這些只能在'內聯'函數中推廣,否則它們會根據使用情況呈現單形類型,這就是發生的情況。

+6

只需要詳細說明一下,這意味着'let inline f x = string x'將使第二個示例的行爲與第一個示例類似。 – kvb 2010-12-19 16:45:17