Почему валидация нарушает законы монады? - PullRequest
0 голосов
/ 04 мая 2018

На SO дается объяснение, почему Валидация, подобная скалязу, котам (Scala) или Стрелке (Котлин), не может быть монадой.

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

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

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

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

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

1 Ответ

0 голосов
/ 04 мая 2018

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

собственность, которую вы упоминаете,

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

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

...