簡単に言えば、平等のためだけです。
最上位環境の厳密な小なり演算子 (<) は、他の比較演算子と同様に少し「特別」です。それらは、整数、実数などの両方で動作するように(唯一のものとして)オーバーロードされるという点で「特別」です。また、このオーバーロードのやや特別なことは、型が推論できない場合に整数が使用されることです(例えば、多形型が推論された'a
)。
整数の場合、Int.<
2 つの整数のみを引数として取る関数が使用されます。
- Int.<;
val it = fn : int * int -> bool
ただし、等値演算子の型からわかるように、等値の場合は少し異なります。
- op=;
val it = fn : ''a * ''a -> bool
ここでは、ポリモーフィック型が bee''a
であることがわかります。二重の pling に注意してください。これは、等価型 (int、string、int'string など) にのみインスタンス化できるためです。real は等値型ではないことに注意してください!
アップデート
私が通常行うことは、作成する (データ) タイプごとに比較関数を作成することです。このようにして、何が起こるかを完全に制御できます。比較関数のアイデアは、順序を返すことです
datatype order = LESS | EQUAL | GREATER
これにより、ケース式を簡単に作成して適切な処理を行うことができます。if .. < .. then .. else ..
アップデート1
以下のコードは、Andreas Rossberg のコメントからのものです。読みやすいようにここに含めました
fun comparePair compareA compareB ((a1, b1), (a2, b2)) =
case compareA (a1, a2) of
EQUAL => compareB (b1, b2)
| other => other
そして、いくつかの使用例
- comparePair Int.compare String.compare ((2, "foo"), (3, "bar"));
val it = LESS : order
- comparePair Int.compare String.compare ((3, "bar"), (3, "bar"));
val it = EQUAL : order