Существует ли монадически естественный в M нетождественный морфизм монад M ~ ›M?

Известно, что естественные преобразования с типовой сигнатурой a -> a должны быть функциями идентичности. Это следует из леммы Йонеды, но может быть получено и напрямую. Этот вопрос требует того же свойства, но для морфизмов монад вместо естественных преобразований.

Рассмотрим морфизмы монад M ~> N между монадами. (Это естественные преобразования M a -> N a, которые сохраняют операции монад с обеих сторон. Эти преобразования являются морфизмами в категории монад.) Мы можем спросить, существует ли морфизм монад e :: (Monad m) => m a -> m a, который работает одинаково для каждой монады m. Другими словами, морфизм монады e должен быть монадически естественным в параметре типа монады m.

Закон монадической естественности гласит, что для любого морфизма монад f: M a -> N a между любыми двумя монадами M и N мы должны иметь f . e = e . f с подходящими параметрами типа.

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

  e :: (Monad m) => m a -> m a
  e ma = ...

Одна неудачная попытка определить такой e:

 e ma = do
         _ <- ma
         x <- ma
         return x

Еще одна неудачная попытка

 e ma = do
         x <- ma
         _ <- ma
         return x

Обе эти попытки имеют правильную сигнатуру типа, но не соответствуют законам морфизма монад.

Кажется, что лемма Йонеды не может быть применена к этому случаю, потому что не существует морфизмов монад Unit ~> M, где Unit - это единичная монада. Я также не могу найти никаких доказательств напрямую.


person winitzki    schedule 26.04.2020    source источник


Ответы (1)


Думаю, вы уже исчерпали все интересные возможности. Любая Monad m => m a -> m a функция, которую мы могли бы определить, неизбежно будет выглядеть так:

e :: forall m a. Monad m => m a -> m a
e u = u >>= k
    where
    k :: a -> m a
    k = _

В частности, если k = return, e = id. Чтобы e не был id, k должен использовать u нетривиальным образом (например, k = const u и k = flip fmap u . const равняются вашим двум попыткам). В таком случае, однако, u эффекты будут дублироваться, что приведет к тому, что e не станет морфизмом монады для ряда вариантов выбора монады m. Таким образом, единственный морфизм монады, полностью полиморфный в монаде, - это id.


Сделаем аргумент более явным.

Для ясности я на мгновение переключусь на презентацию _15 _ / _ 16 _ / _ 17_. Мы хотим реализовать:

e :: forall m a. Monad m => m a -> m a
e u = _

Чем заполнить правую часть? Самый очевидный выбор - u. Само по себе это означает e = id, что не выглядит интересным. Однако, поскольку у нас также есть join, return и fmap, есть возможность рассуждать индуктивно с u в качестве базового случая. Скажем, у нас есть 25, построенное с использованием имеющихся у нас средств. Помимо самого v, у нас есть следующие возможности:

  1. join (return v), что v и поэтому не сообщает нам ничего нового;

  2. join (fmap return v), что тоже v; и

  3. join (fmap (\x -> fmap (f x) w) v), для некоторых других w :: m a, построенных по нашим правилам, и для некоторых f :: a -> a -> a. (Добавление m слоев к типу f, как в a -> a -> m a, и дополнительных join для их удаления ни к чему не приведет, поскольку тогда нам нужно будет показать происхождение этих слоев, и все в конечном итоге сведется к другим случаям.)

Единственный интересный случай - №3. На этом этапе я воспользуюсь ярлыком:

join (fmap (\x -> fmap (f x) w) v)
    = v >>= \x -> fmap (f x) w
    = f <$> v <*> w

Следовательно, любая правая часть, отличная от u, может быть выражена в форме f <$> v <*> w, где v и w являются либо u, либо дальнейшими итерациями этого шаблона, в конечном итоге достигающими u на листьях. Однако аппликативные выражения такого рода имеют каноническую форму, полученную с помощью аппликативных законов, чтобы повторно связать все случаи использования (<*>) слева, которые в данном случае должны выглядеть так ...

c <$> u <*> ... <*> u

... с многоточием, обозначающим ноль или более дальнейших вхождений u, разделенных <*>, а c является a -> ... -> a -> a функцией соответствующей арности. Поскольку a полностью полиморфен, c по параметричности должна быть некоторой const-подобной функцией, которая выбирает один из своих аргументов. В таком случае любое такое выражение можно переписать в терминах (<*) и _55 _...

u *> ... <* u

... с многоточием, обозначающим ноль или более дальнейших вхождений u, разделенных либо *>, либо <*, при этом *> справа от <*.

Возвращаясь к началу, все реализации, не являющиеся id кандидатами, должны выглядеть так:

e u = u *> ... <* u

Мы также хотим, чтобы e был морфизмом монады. Как следствие, это тоже должен быть аппликативный морфизм. Особенно:

-- (*>) = (>>) = \u v -> u >>= \_ -> v
e (u *> v) = e u *> e v

Это:

(u *> v) *> ... <* (u >* v) = (u *> ... <* u) *> (v *> ... <* v)

Теперь у нас есть четкий путь к контрпримеру. Если мы воспользуемся аппликативными законами для преобразования обеих сторон в каноническую форму, мы (по-прежнему) получим чередующиеся u и v с левой стороны и все v после всех u с правой стороны. Это означает, что свойство не будет сохраняться для таких монад, как IO, State или Writer, независимо от того, сколько (*>) и (<*) содержится в e, или какие именно значения выбираются const-подобными функциями с обеих сторон. Быстрая демонстрация:

GHCi> e u = u *> u <* u  -- Canonical form: const const <$> u <*> u <*> u
GHCi> e (print 1 *> print 2)
1
2
1
2
1
2
GHCi> e (print 1) *> e (print 2)
1
1
1
2
2
2
person duplode    schedule 26.04.2020
comment
Я не могу найти достаточно строгих доказательств. Как мы можем доказать, что эффекты u будут обязательно дублированы, если только e = id? (Мы могли бы также написать e u = do _ <- u; _ <- u; _ <- u; u и объединить другие u-эффекты.) Как мы можем математически описать, что монадическое значение p :: m a имеет несколько эффектов, скопированных из u :: m a? И затем, как мы можем доказать, что дублированные (трехкратные и т. Д.) u-эффекты обязательно приводят к нарушению законов морфизма монад? - person winitzki; 28.04.2020
comment
@winitzki Я изложил свой аргумент более подробно. Одно из соображений, которое я определенно совершил в первоначальной редакции ответа, касалось идемпотентности, учитывая, что наблюдаемые мной сбои больше связаны с коммутативностью эффектов. - person duplode; 29.04.2020
comment
Это интересно. Мне придется еще немного подумать об этом. Как мы можем доказать, что существует только один способ реализации нетривиального e u, а именно использование некоторого выражения формы u *> ... <* u, как вы описали? Почему мы не можем найти другую умную и сложную комбинацию fmap, return и join, чтобы получить что-то еще? Это также хороший ход для рассмотрения аппликативных морфизмов. Возможно, было бы легче доказать аналогичное свойство для аппликативных морфизмов, чем для морфизмов монад. (Единственные аппликативные морфизмы, которые аппликативно естественны, - это морфизмы тождества?) - person winitzki; 30.04.2020
comment
@winitzki (1) Хотя было бы неплохо иметь более прозрачную презентацию (я все еще думаю об этом), я считаю, что мои три случая являются исчерпывающими. Только join _ может привести к результату, отличному от id, а №3 - единственный способ, который не приведет к id или бесконечному регрессу. (2) На Applicative: неофициально, если ваша единственная стрела Клейсли - return, вы не используете дополнительную силу, которую приносит Monad, поэтому вы можете также работать с Applicative. (3) Ага, аналогичное свойство имеет место для аппликативных морфизмов. Часть моих аргументов, начинающаяся с канонической формы, которая является самодостаточной, должна служить достаточным доказательством. - person duplode; 01.05.2020
comment
Если бы у нас был морфизм монад, который является монадически естественным, у нас был бы также аппликативный морфизм, который является аппликативно естественным. Думаю, будет проще доказать, что такого аппликативного морфизма не существует. - person winitzki; 01.05.2020