2011-03-17 18 views
4

::などの演算子のタイプをF#のインタラクティブで調べようとしています。私は(::)とそれを囲む場合でもF#対話型の演算子のタイプを確認するにはどうすればよいですか?

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) 

答えて

8

私はこのようにそれを行いますこれは、演算子のタイプを特定の1つのタイプに制限します。 - F#Interactiveは多態的な定義を出力しません(制約付き)。 Stephenが提案した回避策を使用して(そして新しいinline関数を定義して)これを見ることができます。

::ではうまくいかない理由は、実際には::が特殊な構文構造(F#仕様で直接定義されている)です。

0

これはかなり古くなっていますが、私はF#を学んでおり、これを理解したかったのです。

323ページのF# specificationを見ると、シンボリックキーワードもF#でコンパイルされた名前を持つことがわかります。 ::のための同等のコンパイル済みの名前は、実際のタプル受け入れる、op_ColonColon次のとおりです。インライン関数を定義するために::を使用し

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

を私たちに誤解を招くカリー化関数consを与えるだろう、私は信じています。

関連する問題