2

なぜこれが機能しないのかについての参照が見つからないようです:

- (2000,1)<(2000,1);    
stdIn:18.1-18.18 Error: operator and operand don't agree [overload]
  operator domain: 'Z * 'Z
  operand:         (int * int) * (int * int)
  in expression:
    (2000,1) < (2000,1)

標準 ML は構造比較をサポートしていますか?

4

1 に答える 1

6

簡単に言えば、平等のためだけです。

最上位環境の厳密な小なり演算子 (<) は、他の比較演算子と同様に少し「特別」です。それらは、整数、実数などの両方で動作するように(唯一のものとして)オーバーロードされるという点で「特別」です。また、このオーバーロードのやや特別なことは、型が推論できない場合に整数が使用されることです(例えば、多形型が推論された'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
于 2013-01-18T21:31:56.910 に答える