我正在嘗試探索F#interactive中的運算符類型,如::
。如何在F#interactive中查看運算符的類型?
,但我得到這類消息:
Unexpected symbol '::' in expression. Expected ')' or other token.
即使我圍繞着它與(::)
。
我正在嘗試探索F#interactive中的運算符類型,如::
。如何在F#interactive中查看運算符的類型?
,但我得到這類消息:
Unexpected symbol '::' in expression. Expected ')' or other token.
即使我圍繞着它與(::)
。
我不喜歡這樣寫道:
> 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)
你會看到平時運營商的類型,如果你包圍他們用括號:
> (+);;
val it : (int -> int -> int) = <fun:[email protected]>
可惜的是,這將操作符的類型限制爲一種特定類型 - F#Interactive不打印多態定義(與約束)。您可以使用Stephen建議的解決方法(並定義一個新的inline
函數)來查看。
它不適用於::
的原因是::
實際上是一種特殊的句法結構(直接在F#規範中定義)。
這是相當古老的,但我正在學習F#,也想弄清楚這一點。
查看第32頁上的F# specification,我們看到符號關鍵字在F#中也具有編譯名稱。爲::
同等編譯後的名字是op_ColonColon
,這實際上接受的元組:
> op_ColonColon;;
val it : arg0:'a * arg1:'a list -> 'a list = <fun:[email protected]>`
使用::
來定義一個內聯函數會給我們一個咖喱利弊功能,這是一種誤導,我相信。