TL; DR:歴史的な理由。これはの亜種Alternative
になりました。Alternative
をAZero
とAChoice
またはそれに類するものに分割することを提案していない人はMonadPlus
でこのように考えられました。
Alternative
だけApplicative
のように、比較的新しいアイデアです。 guard
が最初に構想されたときには、それは、Monad
に基づいていました。これは、選択と失敗をサポートする必要があります。Alternative
と同じです。その元の型は、このようにMonadPlus
が既に指摘されたHaskellの98のレポートで指定された
guard :: MonadPlus m => Bool -> m()
ました。ハスケル1.0は、まったくモナドを使用しませんでした。 Applicative
が最終的にMonad
のスーパークラスを得たとき、Alternative
はMonadPlus
のスーパークラスとなり、mzero = empty
とmplus = (<|>)
のスーパークラスを得ました。
なぜ、guard
がAlternative
を使用する理由がわかりました。あらかじめMonadPlus
に基づいていたので。では、なぜMonadPlus
がこのように定義されていますか?
わずか1年後、Erik Meijer and Graham Hutton wrote their "Monadic Parsing in Haskell"紙のため、SPJや委員会の他の誰かから、1998年の理由を説明するためにメールを書く必要がありました。
class Monad m => MonadZero m where
zero :: m a
class MonadZero m => MonadPlus m where
(++) :: m a -> m a -> m a
だから、それはあなたがしました。この「停止可能」な方法を処理するために、確かに可能です:あなたは紙を見てみると、あなたが意図するようそのMonadPlus
だけで動作することがわかりますそれを説明した。ただし、現在のところempty
を定義しているbase
クラスはありません。Alternative
はありません。 1つはあるかもしれないが、まだ提案されていない。
これはHaskellクラスを使用した定期的なテーマです。 Monoid
は、mappend
およびmempty
を含む。その受胎後、ある人は、mappend
が意味を持つが、mempty
ではない特定のタイプがあることに気づいた。空Min
は我々だけOrd
を使用している場合、我々はBounded
を使用しなければならないことは不可能であるのに対し、例えば、ここで
newtype Min a = Min a
combine :: Ord a => Min a -> Min a -> Min a
combine (Min x) (Min y) = Min (min x y)
について、mappend = combine
は、明確に連想です。だから今はSemigroup
があります。これはまだMonoid
の基本クラスではありませんが、それは連想操作です。戻ってあなたの元の質問に来て
:guard
はAlternative
がempty
を提供するので、Alternative
を使用し、empty
特定Alternative
年代の評価「が停止し」。それ以外のクラスはありません。まだです。
しかし、提案では、私は分けることに関するコミュニティの意見は何か分かりませんが、ある時点であるかもしれません。Alternative
です。ところで
は、彼らが他の方法でラウンドそれを分割するものの、PureScriptのような言語はAlternative
詳細については...、
をAlternative
を分割し、私は別の例としてMonoid
を使用する理由、Confused by the meaning of the 'Alternative' type class and its relationship to other type classesを参照してください。
また、「純粋」が必要です。確かに、純粋なクラスを提供する 'Pure'クラスと空のクラスを提供する' Empty'クラスを持ち、 'Alternative'を両方とも必要とすることができます。しかし、実用的な理由から、クラスを必ずしも単一メソッドクラスに分割するわけではありません。 – chi
この場合、現実的または歴史的な理由はありますか? – gallais
型がないので、 '空'を実装でき、 '(<|>)'を実装できないと思います。したがって、理論的には、タイプクラス「ストップ可能」は「代替」と等しくなります(タイプのセットは等しくなります)。 – freestyle