これはInconsistent Eq and Ord instances?へのフォローアップの質問です。Haskell:標準ライブラリはEqとOrdが互換性があると仮定しますか?
質問は基本的にあります:タイプにEq
とOrd
インスタンスを宣言するとき、人はそのcompare x y
戻りEQ
を保証しなければならない場合にのみx == y
戻りTrue
場合は?この仮定を破るインスタンスを作成するのは危険ですか?それは自然法則のように思えるかもしれませんが、それはPreludeに明示されていないようです。モナドまたはファンクターの法則。
基本的な対応は、ライブラリがこの法律が成立すると仮定できるので、これを行うのは少し危険です。
私の質問は今です:標準ライブラリのいずれか(特にSet
またはMap
)はこの前提をしていますか? GHCで提供されている標準ライブラリのみに依存している限り、互換性のない型を持つことは危険ですか?Eq
とOrd
?(大量の質問が依然として受け入れられた場合は、一般的に使用されているライブラリのどれがこの法律を前提としていますか?)
編集します。私のユースケースは元の質問と似ています。私はEq
のカスタムインスタンスを持つ型を持っています。これはかなり使います。私がOrd
を望む唯一の理由は、私がMap
のドメインとして使用できるようにするためです。私は特定の順序を気にせず、コードで明示的に使用することはありません。したがって、Ord
の派生インスタンスを使用することができれば、私の人生は楽になり、コードはより明確になります。 (
class (Eq a) => Ord a where
...
それは違反するだろうように、
x == y = compare x y == EQ
x /= y = compare x y /= EQ
に違反し、同じように間違って次のようになります。
を「と一般的に使用された図書館はこの法律を "---人の頭脳? –
確かに、 '(a == b)/ =(a b == EQと比較する)'が意味をなさない、(非contrieved)例の方がよいでしょう。 – Ingo
これはちょうどアイドルな好奇心ですか、または2つの違いを作るのが理にかなっていると思われるユースケースがありますか?後者の場合、私はそれを見たいと思っています(真剣に、私は今興味があり、良いユースケースを自分で考えることはできません....) – jamshidh