aboutsummaryrefslogtreecommitdiff
path: root/src/clojure/contrib/monads.clj
diff options
context:
space:
mode:
authorKonrad Hinsen <konrad.hinsen@laposte.net>2009-03-06 12:45:08 +0000
committerKonrad Hinsen <konrad.hinsen@laposte.net>2009-03-06 12:45:08 +0000
commit6037e78cb29b399004b37ef4be42fe0da68b935d (patch)
tree445ced833b4ae25c4d9b40d4cfcd14124f8a41c3 /src/clojure/contrib/monads.clj
parent245fc9ec4499219bfb66f3fe4789b884b418c7b2 (diff)
monads: added set monad
Diffstat (limited to 'src/clojure/contrib/monads.clj')
-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