... который по сути такой же как:
вопрос возникает из этого ответа впример функтора, который является Аппликативным, но не Монадой: Утверждается, что
data PoE a = Empty | Pair a a deriving (Functor,Eq)
не может иметь экземпляр монады, но я не вижу этого с:
instance Applicative PoE where
pure x = Pair x x
Pair f g <*> Pair x y = Pair (f x) (g y)
_ <*> _ = Empty
instance Monad PoE where
Empty >>= _ = Empty
Pair x y >>= f = case (f x, f y) of
(Pair x' _,Pair _ y') -> Pair x' y'
_ -> Empty
Фактическая причина, по которой я считаю это монадой, состоит в том, что она изоморфнаMaybe (Pair a)
с участиемPair a = P a a
, Они обе монады, оба проходимы, поэтому их состав тоже должен образовывать монаду.О, я узнал не всегда.
Какой контр-пример терпит неудачу, какой монадный закон? (и как это выяснить систематически?)
редактировать: Я не ожидал такого интереса к этому вопросу. Теперь я должен принять решение, если я приму лучший пример или лучший ответ на «систематически» часть.
Между тем, я хочу представить, какjoin
работает для более простогоPair a = P a a
:
P
________/ \________
/ \
P P
/ \ / \
1 2 3 4
он всегда идет по внешнему пути, уступаяP 1 4
, более известный как диагональ в матричном представлении. Для монады ассоциативности мне нужны три измерения, лучше работает визуализация дерева. Из ответа Чи, это неудачный пример объединения, и как я могу его понять.
Pair
_________/\_________
/ \
Pair Pair
/\ /\
/ \ / \
Pair Empty Empty Pair
/\ /\
1 2 3 4
Теперь вы делаетеjoin . fmap join
сначала сворачивая нижние уровни, дляjoin . join
коллапс от корня.