3

整数行の制限に対処したい。すべてのxに対して> xPervasives.compareを扱い、 に対して逆を扱いたいと思います。RightInfinityPoint LeftInfinity

ocamlREPLでは:

# type open_pt = LeftInfinity | Point of int | RightInfinity
  ;;
# List.sort Pervasives.compare [LeftInfinity; Point 0; Point 1; RightInfinity]
  ;;
- : open_pt list = [LeftInfinity; RightInfinity; Point 0; Point 1]

しかし

# type open_pt = LeftInfinity | Point of int | RightInfinity of unit
  ;;
# List.sort Pervasives.compare [LeftInfinity; Point 0; Point 1; RightInfinity ()]
  ;;
- : open_pt list = [LeftInfinity; Point 0; Point 1; RightInfinity ()]

「ポリモーフィック比較の危険性」は言う

バリアントは最初にタグで比較され、タグが等しい場合は、コンテンツまで再帰的に下降します。

バリアントが型宣言に現れる順序とタグの順序の間の関係に依存できますか?

4

1 に答える 1

3

いいえ、それに頼るべきではありません。独自の比較関数を定義する必要があります。もちろん、それはデータ構造を介してそれを持ち上げる必要があることを意味します(たとえば、のリストを比較できるようにするためopen_pt)が、ドメイン固有の比較関数が必要な場合は安全です。

Batteries や Core などの拡張された標準ライブラリは、すべての一般的なデータ構造を介して比較を行う補助関数を提供し、ドメイン固有の比較を を含む任意の型に拡張するのに役立つことに注意してくださいopen_pt

編集:非定数コンストラクターの順序はOCaml/C インターフェイス で指定されているため、それを信頼できることに注意してください。ただし、それは良い考えではないと思います。次回、ファンクターの引数の型の中にクロージャーを配置する必要がある場合はどうでしょうか?

于 2013-06-14T21:03:23.053 に答える