aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/clojure/contrib/monads.clj15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/clojure/contrib/monads.clj b/src/clojure/contrib/monads.clj
index 3d746acf..01ee7784 100644
--- a/src/clojure/contrib/monads.clj
+++ b/src/clojure/contrib/monads.clj
@@ -1,7 +1,7 @@
;; Monads in Clojure
;; by Konrad Hinsen
-;; last updated March 3, 2009
+;; last updated March 6, 2009
;; Copyright (c) Konrad Hinsen, 2009. All rights reserved. The use
;; and distribution terms for this software are covered by the Eclipse
@@ -243,6 +243,19 @@
(apply concat mvs))
])
+; Set monad
+(defmonad set-m
+ "Monad describing multi-valued computations, like sequence-m,
+ but returning sets of results instead of sequences of results."
+ [m-result (fn m-result-set [v]
+ #{v})
+ m-bind (fn m-bind-set [mv f]
+ (apply clojure.set/union (map f mv)))
+ m-zero #{}
+ m-plus (fn m-plus-set [& mvs]
+ (apply clojure.set/union mvs))
+ ])
+
; State monad
(defmonad state-m
"Monad describing stateful computations. The monadic values have the