これは、設計コード、特にライブラリで何度か出てきた質問です。少し興味があるようですので、良いコミュニティ wiki になるのではないかと思いました。
Monadのfailメソッドは、いぼだと考える人もいます。元の圏論に由来しないクラスへのいくぶん恣意的な追加。しかし、もちろん現在の状態では、多くのモナド型は論理的で有用なfailインスタンスを持っています。
MonadPlus クラスは Monad のサブクラスでありmzero、モナドに失敗の概念を論理的にカプセル化するメソッドを提供します。
したがって、ある種の障害処理を行うモナド コードを書きたいライブラリ設計者は、自分のコードfailで Monad のメソッドを使用するか、自分のコードを MonadPlus クラスに制限するかを選択できmzeroます。彼はモノイド結合mplus操作をまったく気にしません。
この主題に関するいくつかの議論は、MonadPlus クラスを改革するための提案に関するこの wiki ページにあります。
だから私は1つの特定の質問があると思います:
fail自然なメソッドを持っているが、MonadPlus の論理的な実装を持たないために MonadPlus のインスタンスになれないモナドのインスタンスがあればmplus?
しかし、私は主にこの主題に関する議論に興味があります。ありがとう!
編集:最後の考えが1つ浮かびました。私は最近fail、(x:xs) <- return []モナドのfail.
言語設計者はfail、Monad に含まれる Haskell の構文に組み込まれた何らかの自動障害処理の可能性に強く影響されたに違いないようです。