2011-03-17 68 views

回答

8

我不喜歡這樣寫道:

> let inline showmecons a b = a :: b;; 

val inline showmecons : 'a -> 'a list -> 'a list 

> let inline showmepow a b = a ** b;; 

val inline showmepow : 
    ^a -> ^b -> ^a when ^a : (static member Pow : ^a * ^b -> ^a) 
4

你會看到平時運營商的類型,如果你包圍他們用括號:

> (+);; 
val it : (int -> int -> int) = <fun:[email protected]> 

可惜的是,這將操作符的類型限制爲一種特定類型 - F#Interactive不打印多態定義(與約束)。您可以使用Stephen建議的解決方法(並定義一個新的inline函數)來查看。

它不適用於::的原因是::實際上是一種特殊的句法結構(直接在F#規範中定義)。

0

這是相當古老的,但我正在學習F#,也想弄清楚這一點。

查看第32頁上的F# specification,我們看到符號關鍵字在F#中也具有編譯名稱。爲::同等編譯後的名字是op_ColonColon,這實際上接受的元組:

> op_ColonColon;; 
val it : arg0:'a * arg1:'a list -> 'a list = <fun:[email protected]>` 

使用::來定義一個內聯函數會給我們一個咖喱利弊功能,這是一種誤導,我相信。

相關問題