В продолжение Каков пример Монады, которая является Альтернативой, но не МонадПлюс? :
Предположим, является монадой. Каковы отношения betweem м будучи Alternative , а MonadPlusCatch и MonadPlusDistr ? Для каждой из шести возможных пар я хотел бы иметь либо доказательство того, что одно подразумевает другое, либо контрпример, что это не так.
(Я использую
MonadPlusCatch, чтобы отличить MonadPlus, который удовлетворяет правилу Left-Catch :
mplus (return a) b = return a
MonadPlusDistr, чтобы отличить MonadPlus, который защищает правило левого распределения :
mplus a b >>= k = mplus (a >>= k) (b >>= k)
см. MonadPlus на HaskellWiki .)
Мои нынешние знания + интуиция таковы:
- MonadPlusDist Альтернатива -
скорее всего,правда -это кажется простым, я думаю, что у меня есть набросок доказательства, я его проверю и, если он правильный, яопубликую, AndrewC ответил на эту часть. -
Maybe
MaybeT (Either e)
MaybeT m'
((pure x) <|> g) <*> a = -- LeftCatch (pure x) <*> a -- which in general cannot be equal to ((pure x) <*> a) <|> (g <*> a)
еще раз проверю и выложу. (Интересно, что только
Maybe
это доказуемо, потому что мы можем проанализировать, еслиa
естьJust something
илиNothing
- см. Ответ вышеупомянутого AndrewC.)-
[]
[]
-
[]
-
Maybe
f <$>
она не несет никаких идиоматических действий, она чистая, поэтому можно как-то «поменять стороны».[]
.[]
удовлетворяет MonadPlusCatch? На данный момент это просто утверждение на HaskellWiki.>>= k
определяется явно с помощьюfoldr ((++).k)
На самом деле это
MaybeT Either
:Выход
Это означает, что
MaybeT Either
не соответствует закону левого распределенияApplicative
.Причина в том, что
игнорирует
g
(из-за LeftCatch ) и оценивает тольконо это отличается от того, что оценивает другая сторона:
источник