質問: これは、`Maybe`と`Monad`を模倣したものなので、モナド則が保たれているわけですが、この状態からどこかを書き換えるとモナド則をくずせるものなのでしょうか? 本来であれば `Applicative` のインスタンスである必要もあるようですが、3つの法則とは関係ないと考えています。 まだ模倣の通りしか使っていくことができず、普通にプログラムを書いていったときに、どのようなタイミングでモナド則を崩してしまうのかしりたいと思っています。 つまりどこの部分にどのように注意してコードを書けばいいのかというようなことが気になっています。おそらく、`instance`を実装しているときですよね? `instance`の実装さえミスがなければ `f`や`g` はモナド則を満たさなくなってしまうことと関係ないと思っているのですがいかがでしょうか?
回答: `return x = Null` にしてしまうとか、`(Have x) >>>>> f = Null` にしてしまうとか、とにかく型があってさえいれば実装は色々できてしまうことを考えると壊れる例が作れます。 モナド則の良いところは、この規則を満たすように書いてしまえば後は様々な "モナド的な" 操作を気にせずに行えるところにあります。具体的には do 記法などです。それで良いことが(一定の仮定のもとで)証明できます。というより、モナド則から証明できることが "モナド的な" 操作として知られている、といった方が近いですが。 ただし、ある型に対して、モナド則を満たすような instance の定義はひとつではないことには注意が必要です。少しややこしいので詳細は書きませんが、たとえばリストのモナドはいくつかの instance を考えることができます。