2013-10-21 5 views
5

私はthisオンラインコンパイラを使っていくつかのF#コードで遊んでいました(正確なF#コンパイラバージョンが見つかりませんでしたが、これは後で関連します)。私は、次の2つの機能は非常に異なっていたが実現:なぜ '!='の使用は曖昧だと考えられますが、同様の '='の使用はそうではありませんか?

let f x y = x = y 
let g x y = x != y 

fは完全に汎用的ですが、私の驚きにgではありませんでした。メッセージでコンパイルエラーが発生しますg 1 2を呼び出す:

、一般的な構成は、それが私が行った構造体

である。すなわち、型「intは」参照セマンティクスを持っていますが、そうでないことを必要とし、

エラーFS0332:私はgを定義しようとしたときに、これは私自身のマシンで試してみました(モノラル上のF#3.0を使用して、私は、Visual Studio 2012で同じ結果を得る)と完全に異なるエラーを受け取っ解決できませんでした。固有のあいまいさこのプログラムポイントまたはその近くで演算子 '(!=)'を使用します。あいまいさを解決するためにタイプ注釈を使用することを検討してください。

!=の使用が曖昧で、なぜそれがエラーなのですか?また、なぜこのような!=の使用はあいまいだと考えられていますが、=の使用はfではありませんか?この新しいエラーは、私が期待していたように自動化された汎化がうまくいかないケースを警告するのに役立ちます。しかし、これは、F#コンパイラの2つの異なるバージョン間で大きな変更と思われます。これらのエラーメッセージの両方の検索が空になった。私はF# specificationに関連性があるとは思わなかった。関連するセクションへのポインタは役に立ちます。

+0

リンク:http://stackoverflow.com/questions/9130181/what-is-the-f-syntax-for-not-equal-to – DuckMaestro

答えて

12

!=は、F#の不等号演算子の名前ではなく、<>です。 <>を使用して

http://msdn.microsoft.com/en-us/library/dd233228.aspx

あなたの例では=としてだけで同じことができるはずです。

+0

今、 '!='がまったく許可されているのはなぜですかそれはカスタムオペレータかもしれないからです)。 C#のバックグラウンドでは、 '!='は自然なことであり、オンラインコンパイラは長い間それを使い果たしました。 –

+0

@mikezコンパイラはインテントを推論するために多くのことしかできません。 F#をコーディングする人の誰もがアルゴールの背景から来ているわけではありません。 –

+0

@OnorioCatenacci私の混乱の大部分は、私がそのオンラインコンパイラで '!='で期待したように機能するスニペットを書いたという事実から来ています。コンパイラをアップグレード/修正するための提案を記録しました。 –

9

既存の回答は、コードが期待どおりに動作しない理由を説明しています。そのため、何を伝えようとしているのかの説明を追加してください。この場合、

let fish x y = x <*>><< y 

F#がカスタム演算子をサポートし、あなたが機能で、例えば魚の演算子を使用しようと、他の(有効な)演算子記号に同じエラーメッセージが表示されますF#では汎用関数を定義することはできません。.NETには、1つまたは他の引数の型が<*>><<演算子をサポートするという一般的な制約を指定する方法がありません(.NET言語では、制約の1つ特定の静的メソッドが必要です)。

これは、比較または同等(F#はこれらを表す方法があるため)の場合ではありません。しかし、+のようなものを使用すると、それでも汎用関数は得られませんが、intに特化した関数が得られます。その場合、あなたはinlineを使用し、汎用的な関数を書くことができます(+オペレータが必要です):

同様
let inline add x y = x + y 
add 1 2 
add 1.1 2.2 

、あなたは(魚や!=のような)任意のカスタムオペレータを必要とするインライン関数を定義することができますが、あなたそれでも標準的な型で呼び出すことはできません。

+2

+1素晴らしい詳細、ありがとう。同じことが['¸。・'・ '・¯・.¸¸・・'・.¸><(((º> '演算子](http://1lineart.kolaone.com/art/41)にも適用されますか? :P –

+0

カスタムオペレータで使用できる文字のセットは非常に制限されています(http://msdn.microsoft.com/en-us/library/dd233204.aspx)。特に、非ASCII文字。 – Tarmil

+2

@RubenBartelinkあなたができることはおそらく '.-^-..-^-..-^-..-^- .. >><<*>' :-) –

関連する問題