Я читал превосходное введение в монады для программистов Clojure. Статья иллюстрирует, что монада Идентификационных данных функционально эквивалентна Clojure, позволил и что монада Последовательности/Списка эквивалентна для.
Когда статья добирается до преобразователей монады, она показывает пример, объединяющийся, Возможно, и монады Последовательности. Хорошо, таким образом, одна причина использования монады Последовательности вместо для состоит в том, что я могу преобразовать его. Однако преобразование монады Идентификационных данных не имеет смысла мне - который не всегда был бы эквивалентен просто созданию вообще, монада преобразования? Например, если я преобразовал, Возможно, с Идентификационными данными - который не просто дает мне, Возможно, который было бы легче объявить непосредственно?
Кто-то может разрешить, существует ли практическое применение в Clojure для того, чтобы предпочесть монаду Identity позволенному (возможно, я не думаю полностью через последствия преобразователей?), или это просто там для теоретической полноты?
Одной из веских причин является то, что вы можете писать монадические функции, не привязанные к конкретной монаде, а затем выполнять их в блоке with-monad
. identity-m
дает вам возможность не вовлекать какое-либо особое монадическое вуду, если вы напишете (with-monad identity-m ...)
.
(Понятно, что это не сработает, если ваша монадическая функция существенно использует некоторые свойства монады, с которой она работает, например, доступность геттера и сеттера для состояния и т. Д. Не все монадические функции такие, однако .)
Действительно, монада идентичности очень полезна в качестве основы в преобразователе монад. Например, преобразователь монады Maybe (might-t) допускает значение none, кроме nil:
1:2 => (use 'clojure.contrib.monads)
nil
1:3 => (domonad maybe-m [a 1 b 2] (+ a b))
3
1:4 => (domonad maybe-m [a 1 b nil] (+ a b))
nil
;; Domain uses the :fail keyword as the nil value:
1:6 => (domonad (maybe-t identity-m :fail) [a 1 b :fail] (+ a b))
:fail
Обратите внимание, что использование might-m в качестве базовой монады приведет к сокращению как для: fail, так и для nil, вместо just: fail.