Используйте для монады личности в Clojure - PullRequest
10 голосов
/ 16 августа 2010

Я читал отличное введение в монады для программистов Clojure . В статье показано, что монада Identity функционально эквивалентна let Clojure и что монада Sequence / List эквивалентна для .

Когда статья попадает к преобразователям монад, она показывает пример, объединяющий монады Maybe и Sequence. Итак, одна из причин использования монады Sequence вместо для состоит в том, что я могу преобразовать ее. Однако трансформация монады Identity для меня не имеет смысла - разве это не будет равнозначно простому построению монады-трансформера? Например, если бы я трансформировал Maybe с помощью Identity - разве это не дало бы мне «Maybe», которое было бы проще объявить напрямую?

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

Ответы [ 2 ]

8 голосов
/ 17 августа 2010

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

Обратите внимание, что при использовании возможно-m в качестве базовой монады ярлыки будут на обоих: сбой и ноль, а не просто: сбой.

7 голосов
/ 16 августа 2010

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

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

...