9

Monadインスタンスがモナドの法則に従うべきであることはよく知られています。Functorインスタンスがファンクターの法則に従うべきであることは、おそらくあまり知られていません。それでも、を最適化するGHC書き換えルールを作成することにはかなり自信がありますfmap id == id

他にどのような標準クラスに暗黙の法則がありますか?(==)真の同値関係である必要がありますか?Ord半順序を形成する必要がありますか?全順序?少なくとも推移的であると想定できますか?反対称?

これらの最後のいくつかは、Haskell 2010レポートで指定されていないようであり、それらを利用して書き換えルールを作成する自信もありません。しかし、そうする一般的なライブラリはありますか?どれほど病的なインスタンスを自信を持って書くことができますか?

最後に、そのようなインスタンスがどれほど病理学的である可能性があるかについての境界があると仮定すると、各型クラスインスタンスが支持しなければならない法則のための標準的で包括的なリソースがありますか?


例として、定義するのにどれだけの問題がありますか

newtype Doh = Doh Bool
instance Eq Doh where a == (Doh b) = b

理解するのが難しいだけですか、それともコンパイラはどこかで正しく最適化されませんか?

4

3 に答える 3

5

Haskellレポートは、次の法律について言及しています。

  • ファンクター(例fmap id == id
  • モナド(例m >>= return == m
  • 積分(例(x ‘quot‘ y)*y + (x ‘rem‘ y) == x
  • 番号(abs x * signum x == x
  • 表示(showsPrec d x r ++ s == showsPrec d x (r ++ s)
  • Ix(例inRange (l,u) i == elem i (range (l,u))

それが私が見つけることができたすべてです。具体的には、式(6.3.1)に関するセクションでは、法則については言及されておらず、Ordに関する次の法則についても言及されていません。

于 2013-02-16T11:06:26.750 に答える
4

法律が「あるべきである」という私自身の見解は、すべての標準的な事例によって支持されているわけではありませんが、私は思います

  • Eq同値関係である必要があります。
  • Ord全順序である必要があります
  • NumfromInteger環準同型の環であり、abs/signum明白な方法で動作する必要があります。

多くのコードは、これらの「法則」が保持されていなくても保持されると想定します。これはHaskell固有の問題ではなく、初期のCでは、コンパイラが代数法に従って算術を並べ替えることができました。ほとんどのコンパイラには、現在の標準では許可されておらず、プログラムの結果が変わる可能性がある場合でも、このような最適化を再度有効にするオプションがあります。

于 2013-02-13T20:19:14.750 に答える
1

以前は、Ixの法則を破ると、ほぼ何でもできるようになりました。最近、彼らはそれを修正したと思います。詳細はこちら:クラスの法律に違反するとGHCで問題が発生する可能性があることを誰かが知っていますか(または覚えていますか)?

于 2013-02-28T19:23:46.583 に答える