Ваши описания кажутся довольно хорошими.Обычно люди говорят о трех законах монад, которые у вас есть как 1, 2 и 4. Ваш третий закон немного отличается, и я вернусь к этому позже.
Для трех законов монад я нахожу егогораздо проще получить интуитивное понимание того, что они имеют в виду, когда они переписаны с использованием композиции Клейсли:
-- defined in Control.Monad
(>=>) :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c
mf >=> n = \x -> mf x >>= n
Теперь законы можно записать в виде:
1) return >=> mf = mf -- left identity
2) mf >=> return = mf -- right identity
4) (f >=> g) >=> h = f >=> (g >=> h) -- associativity
1)Левый закон идентичности - возврат значения не меняет значение и ничего не делает в монаде.
2) Правый закон идентичности - возврат значения не меняет значение и ничего не делаетв монаде.
4) Ассоциативность - монадная композиция ассоциативна (мне нравится ответ Кенни ТМ за это)
Два закона идентичности в основном говорят одно и то же, но оба они необходимы, потому что return
должен иметь идентичное поведение по обе стороны от оператора связывания.
Теперь о третьем законе.Этот закон по существу говорит, что и экземпляр Functor, и ваш экземпляр Monad ведут себя одинаково при поднятии функции в монаду, и что ни один из них не делает ничего монадического.Если я не ошибаюсь, это тот случай, когда монада подчиняется другим трем законам, а экземпляр Functor подчиняется законам функторов, тогда это утверждение всегда будет верным.
Многое из этого происходит от Haskell Wiki . Typeclassopedia также является хорошим справочником.