(defn maybe-t
"Monad transformer that transforms a monad m into a monad in which
the base values can be invalid (represented by nothing, which defaults
to nil). The third argument chooses if m-zero and m-plus are inherited
from the base monad (use :m-plus-from-base) or adopt maybe-like
behaviour (use :m-plus-from-transformer). The default is :m-plus-from-base
if the base monad m has a definition for m-plus, and
:m-plus-from-transformer otherwise."
([m] (maybe-t m nil :m-plus-default))
([m nothing] (maybe-t m nothing :m-plus-default))
([m nothing which-m-plus]
(monad-transformer m which-m-plus
[m-result (with-monad m m-result)
m-bind (with-monad m
(fn m-bind-maybe-t [mv f]
(m-bind mv
(fn [x]
(if (identical? x nothing)
(m-result nothing)
(f x))))))
m-zero (with-monad m (m-result nothing))
m-plus (with-monad m
(fn m-plus-maybe-t [& mvs]
(if (empty? mvs)
(m-result nothing)
(m-bind (first mvs)
(fn [v]
(if (= v nothing)
(apply m-plus-maybe-t (rest mvs))
(m-result v)))))))
])))
Vars in
clojure.contrib.monads/maybe-t:
defn
Used in 0 other vars
Comments top
No comments for maybe-t. Log in to add a comment.