Почему проверка нарушает законы монад?

В SO дается объяснение, почему проверка, как в скалязе, кошки (Scala) или Arrow (Kotlin) не могут быть монадой.

Насколько я понимаю, это потому, что они смоделировали монады в терминах аппликативных функторов, и желаемое поведение валидации как аппликативного (сбор всех недействительных) отличается от желаемого поведения валидации как монады (проверки последовательности и быстрая ошибка на первый недействительный). В результате вам нужно преобразовать проверку в либо (что является монадой), если вы хотите, чтобы сбой был быстрым.

На https://groups.google.com/forum/#!msg/scalaz/IWuHC0nlVws/syRUkXJklWIJ, они упоминают причину, по которой проверка не является монадой, потому что следующее свойство не будет выполняться:

x <|*|> y === x >>= (a => y map ((a, _))) 

Но если посмотреть на определение монады, указанное выше свойство не является частью законов монад. Итак, является ли это результатом того, что монады реализованы в терминах аппликативов, или указанное выше свойство является предпосылкой для того, чтобы быть монадой?

Все эти рассуждения более высокого порядка для меня совершенно в новинку, но в моем ограниченном понимании FP я мог бы иметь тип данных проверки, который имеет один тип поведения при использовании в качестве аппликативного (накопление инвалидов) и другое поведение при использовании в качестве монады ( быстро терпит неудачу).


person Jan Bols    schedule 04.05.2018    source источник
comment
Возможный дубликат Почему AccValidation не может иметь экземпляр Monad?   -  person Nicolas Henin    schedule 13.06.2018


Ответы (1)


У тебя все правильно. Да, экземпляр законной монады для Validation возможен. Проблема в том, что это приведет к появлению двух разных Applicative экземпляров для Validation: один накапливает ошибки, другой получен из экземпляра монады и быстро завершается с ошибкой. Это привело бы к несогласованности классов типов: поведение программы зависит от того, как был получен экземпляр класса типов.

Указанное вами свойство,

x <|*|> y === x >>= (a => y map ((a, _)))

может служить определением <|*|> в терминах >>= и map и, таким образом, автоматически выполняется для аппликативного выражения, производного от монады. Проблема в том, что уже существует другой Applicative с другим поведением <|*|>.

person Tomas Mikula    schedule 04.05.2018
comment
законный экземпляр монады для проверки невозможен ... Вы можете посмотреть здесь: stackoverflow.com/questions/40539650/ - person Nicolas Henin; 13.06.2018
comment
и здесь: stackoverflow.com/questions/50844042/ - person Nicolas Henin; 13.06.2018
comment
у вас не может быть монадической последовательности действий на части a структуры функтора, только на части значения функтора ... - person Nicolas Henin; 13.06.2018
comment
Экземпляр монады, о котором я говорю, будет вести себя так же, как монада для Either. Это законно. Есть 3 монадных закона (левая идентичность, правая идентичность, ассоциативность), и все они выполняются. - person Tomas Mikula; 14.06.2018
comment
Тогда это замаскированная монада Either, а не та (которая не существует) из аппликатива валидации. У вас может быть несколько аппликативов для одного и того же функтора (например, любой функтор имеет либо аппликатив, либо валидационный аппликатив, проверка - это просто переименование of Either, чтобы провести различие между 2). Существует столько приложений, сколько у вас может быть Monoids для объединения двух структур функторов. Но у вас есть только одна монада для одного аппликативного - person Nicolas Henin; 14.06.2018
comment
да. Думаю, в своем ответе я ясно дал понять, что эта монада дает начало другому Аппликативу, нежели тот, который нас обычно интересует. - person Tomas Mikula; 14.06.2018
comment
хо ... поскольку Validation без его Applicative не имеет никакой полезности по сравнению с Either ... Я был сбит с толку тем, как вы это объяснили .... Это название библиотеки в haskell: Validation: тип данных, например Either но с накапливающимся Аппликативом проверка существует только из-за своего Аппликатива ... - person Nicolas Henin; 14.06.2018
comment
Я попытался прояснить конкретно то, что, казалось, смущало автора вопроса. Возможно, кто-то, кто использует другой набор предположений (например, проверка неотделима от своего аппликатива), сочтет мой ответ более запутанным, чем поясняющим. - person Tomas Mikula; 14.06.2018
comment
Кстати, если у вас есть только одна монада для одного аппликатива, в конце этого ответа есть контрпример. - person Tomas Mikula; 14.06.2018