2014-01-15 47 views
3

好吧,對不起的標題感到抱歉。F#的語法解釋(^)

考慮以下功能:

let inline getName arg = 
    (^a : (member Name : string) arg) 

我知道它做什麼,但我知道那只是因爲我複製粘貼它。

它說:給出arg返回argname成員。

但是我不明白的第一部分^a,也不是我得到的: (member Name : string)

我所知道的是,最後的arg正在應用^a : (member Name : string)函數的arg的值。

回答

9

^用於指定type parameter is statically resolved,這意味着類型將在編譯時解析,而不是在運行時解析。

第二部分是generic constraint,它指定該類型必須具有名爲Name的成員,並帶有給定的簽名,在此例中爲字符串屬性。告訴你的語法是如何實際調用成員和編譯器推斷在功能上通用約束,但你也可以明確地指定約束,但也沒有必要。

let inline getName (arg : ^a when ^a : (member Name : string)) = 
    (^a : (member Name : string) arg) 
+1

要清楚:'^ a:(member Name:string)'基本上是一個函數,它返回參數'arg'的Name成員? – mydogisbox