• (maybe-t m)
  • (maybe-t m nothing)
  • (maybe-t m nothing which-m-plus)
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.

1 Example top

  • (use 'clojure.contrib.monads)
    ; Clojure 1.3: (use 'clojure.algo.monads)
    
    ;; We want to combine failing computations and nondeterminism
    ;; The sequence monad is not sufficient
    user=> (domonad sequence-m [x [2 nil 3] y [2 3]] (* x y))
    NullPointerException   clojure.lang.Numbers.ops (Numbers.java:942)
    
    ;; Create a combined monad by applying the maybe-t monad transformer
    user=> (def maybe-seq-m (maybe-t sequence-m))
    #'user/maybe-seq-m
    
    ;; The combined monad can handle failing computations
    user=> (domonad maybe-seq-m [x [2 nil 3] y [2 3]] (* x y))
    (4 6 nil 6 9)
    
Log in to add / edit an example.

See Also top

Log in to add a see also.

Plus_12x12 Minus_12x12 Source clojure/contrib/monads.clj:496 top

(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.