Monad
インスタンスがモナドの法則に従うべきであることはよく知られています。Functor
インスタンスがファンクターの法則に従うべきであることは、おそらくあまり知られていません。それでも、を最適化するGHC書き換えルールを作成することにはかなり自信がありますfmap id == id
。
他にどのような標準クラスに暗黙の法則がありますか?(==)
真の同値関係である必要がありますか?Ord
半順序を形成する必要がありますか?全順序?少なくとも推移的であると想定できますか?反対称?
これらの最後のいくつかは、Haskell 2010レポートで指定されていないようであり、それらを利用して書き換えルールを作成する自信もありません。しかし、そうする一般的なライブラリはありますか?どれほど病的なインスタンスを自信を持って書くことができますか?
最後に、そのようなインスタンスがどれほど病理学的である可能性があるかについての境界があると仮定すると、各型クラスインスタンスが支持しなければならない法則のための標準的で包括的なリソースがありますか?
例として、定義するのにどれだけの問題がありますか
newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b
理解するのが難しいだけですか、それともコンパイラはどこかで正しく最適化されませんか?