Различие между типами monadplus, Alternative и Monoid?



стандартная библиотека Haskell typeclasses MonadPlus,Alternative и Monoid каждый предоставляет два метода с практически одинаковой семантикой:




  • пустое значение: mzero,empty или mempty.

  • оператор a -> a -> a что объединяет значения в классе вместе:mplus,<|> или mappend.


все три закона указывают, каких инстанций следует придерживаться:



mempty `mappend` x = x
x `mappend` mempty = x


таким образом, кажется, три классов типов являются обеспечение то же самое методы.



(Alternative предоставляет some и many, но их определения по умолчанию обычно достаточны, и поэтому они не слишком важны с точки зрения этого вопроса.)



Итак, мой вопрос: почему эти три чрезвычайно похожих класса? Есть ли реальная разница между ними, помимо различных ограничений суперкласса?

557   1  

1 ответ:

MonadPlus и Monoid служат для разных целей.

A Monoid параметризуется над типом вида *.

class Monoid m where
    mempty :: m
    mappend :: m -> m -> m

и поэтому он может быть создан практически для любого типа, для которого существует очевидный оператор, который является ассоциативным и который имеет единицу.

, MonadPlus не только указывает, что у вас есть моноидальная структура, но и что эта структура связана с тем, как Monad строительство, и что эта структура не заботится о значении, содержащемся в монаде, это (частично) указано тем фактом, что MonadPlus принимает аргумент типа * -> *.
class Monad m => MonadPlus m where
    mzero :: m a
    mplus :: m a -> m a -> m a

в дополнение к законам моноидом, у нас есть два потенциальных своды законов мы можем применить к MonadPlus. К сожалению, община не согласна с тем, какими они должны быть.

по крайней мере, мы знаем

mzero >>= k = mzero

но есть еще два конкурирующих расширения, слева (sic) закон распределения

mplus a b >>= k = mplus (a >>= k) (b >>= k)

и левый закон улова

mplus (return a) b = return a

так что любой экземпляр MonadPlus должен удовлетворять одному или обоим из этих дополнительных законов.

так что насчет Alternative?

Applicative был определен после Monad, и логически принадлежит как суперкласс Monad, но в основном из-за различных давлений на дизайнеров обратно в Haskell 98, даже Functor не был суперклассом Monad до 2015 года. Теперь мы наконец-то есть Applicative как суперкласс Monad в GHC (если еще не в языковом стандарте.)

эффективно Alternative это Applicative что MonadPlus это Monad.

за это мы бы получили

empty <*> m = empty

аналогично тому, что мы имеем с MonadPlus и существуют аналогичные дистрибутивные и catch свойства, по крайней мере один из которых вы должны удовлетворить.

к сожалению, даже empty <*> m = empty закон-это слишком сильное требование. Он не держит для назад, например!

когда мы смотрим на MonadPlus, пустой > > = F = пустой закон почти навязан нам. Пустая конструкция не может иметь никаких ' a ' в нем, чтобы вызвать функцию f С в любом случае.

С Applicative и не суперкласс Monad и Alternative и не суперкласс MonadPlus, мы заканчиваем определение обоих экземпляров отдельно.

более того, даже если Applicative был a суперкласс Monad, вы бы в конечном итоге нуждаетесь в MonadPlus класс в любом случае, потому что даже если бы мы подчинились

empty <*> m = empty

это не достаточно строго, чтобы доказать, что

empty >>= f = empty

Итак, утверждая, что что-то MonadPlus сильнее, чем утверждать, что это Alternative.

теперь, по соглашению,MonadPlus и Alternative для данного типа следует согласиться, но Monoid может быть полностью разные.

, например,MonadPlus и Alternative на Maybe сделать очевидную вещь:

instance MonadPlus Maybe where
    mzero = Nothing
    mplus (Just a) _  = Just a
    mplus _        mb = mb

но Monoid экземпляр поднимает полугруппу в Monoid. К сожалению, потому что не было Semigroup класс В то время в Haskell 98, он делает это путем запроса a Monoid, но не используя его полностью. ಠ_ಠ

instance Monoid a => Monoid (Maybe a) where
    mempty = Nothing
    mappend (Just a) (Just b) = Just (mappend a b)
    mappend Nothing x = x
    mappend x Nothing = x
    mappend Nothing Nothing = Nothing

TL; DRMonadPlus - это больше, чем Alternative, что в свою очередь является более сильным утверждением, чем Monoid, а MonadPlus и Alternative экземпляров типа должно быть связано, то Monoid может быть (а иногда и есть) что-то совершенно другое.

Comments

    Ничего не найдено.