Используйте для монады идентификационных данных в Clojure

Я читал превосходное введение в монады для программистов Clojure. Статья иллюстрирует, что монада Идентификационных данных функционально эквивалентна Clojure, позволил и что монада Последовательности/Списка эквивалентна для.

Когда статья добирается до преобразователей монады, она показывает пример, объединяющийся, Возможно, и монады Последовательности. Хорошо, таким образом, одна причина использования монады Последовательности вместо для состоит в том, что я могу преобразовать его. Однако преобразование монады Идентификационных данных не имеет смысла мне - который не всегда был бы эквивалентен просто созданию вообще, монада преобразования? Например, если я преобразовал, Возможно, с Идентификационными данными - который не просто дает мне, Возможно, который было бы легче объявить непосредственно?

Кто-то может разрешить, существует ли практическое применение в Clojure для того, чтобы предпочесть монаду Identity позволенному (возможно, я не думаю полностью через последствия преобразователей?), или это просто там для теоретической полноты?

10
задан G__ 16 August 2010 в 04:23
поделиться

2 ответа

Одной из веских причин является то, что вы можете писать монадические функции, не привязанные к конкретной монаде, а затем выполнять их в блоке with-monad . identity-m дает вам возможность не вовлекать какое-либо особое монадическое вуду, если вы напишете (with-monad identity-m ...) .

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

7
ответ дан 3 December 2019 в 22:34
поделиться

Действительно, монада идентичности очень полезна в качестве основы в преобразователе монад. Например, преобразователь монады 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.

8
ответ дан 3 December 2019 в 22:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: