私は最近、Microsoft Solver Foundation Services を利用して F# で何かを書き込もうとしましたが、そうしているうちに問題にぶつかりました。C# では t1 > t2 として単純に表現できる (Term > Term) 条件を表現する必要がありました。別の Term オブジェクトを返します。代わりに、F# では、t1 > t2 を使用すると項ではなく bool が生成されるのと同じ結果を得るために、Term.op_GreaterThan を呼び出す必要がありました。
F# がブール値を生成する場合にのみ op_GreaterThan を選択するのはなぜですか? また、Term が IComparable を実装していない場合、F# の t1 > t2 の解釈にはどのような意味があるのでしょうか?
構造比較の概念に基づいて平等と全体の平等でそのようなことを行う理由を理解していることに注意してください。それを「より大きい」に拡張する方法がわかりません/」
3 に答える
教科書の答え:
演算子のオーバーロードは、共通言語仕様の一部ではありません。つまり、コンパイラの作成者は、必要に応じて無視するか、部分的にのみサポートすることができます。ライブラリ ライターとして、ユーザーがクラスを操作するための代替手段を提供する責任があります。
実用的な答え:
そもそもやることがバカだから。op_GreaterThan メソッドは、比較を行うために明示的に作成されました。つまり、2 つの用語を連結するような「興味深い」ことを行うべきではありません。CLR は、C++ などのレガシー言語をサポートする必要があるため、悪用することしかできません。
ところで、特に 2 つのものを結合するためのオーバーロードがあります。これは op_Concatenate と呼ばれます。op_GreaterThan の代わりに使用することを検討する必要があります。
編集
ほとんど良い答え:
F# では、私が言及した連結演算子は ^ です。
C# でサポートされているかどうかわからないので、これをほぼ良い答えと呼んでいます。VB と F# でのみ許可されていると思います。
編集#2
結局、F# は ^ オーバーロードを尊重していないようです。
編集#3
ここでWTFが行われていますか?F# は > 演算子をまったく尊重しません。確かにオーバーロードでき、op_GreaterThan メソッドを正しく発行しますが、無視されます。op_GreaterThan を使用しようとさえせず、代わりに System.IComparable インターフェイスを探します。
さらに悪いことに、これは実行時チェックです。クラス Foo が IComparable を実装していないことを静的に判断できますが、それでも先に進み、とにかくコードをコンパイルします。
< および > 演算子を使用する必要はありません。Solver Foundation Services Model クラスには Greater メソッドと Less メソッドがあり、代わりにそれらを使用できるはずです。