diff options
author | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-02-27 13:41:49 +0000 |
---|---|---|
committer | Konrad Hinsen <konrad.hinsen@laposte.net> | 2009-02-27 13:41:49 +0000 |
commit | 535f4ceac5f41f873250093174a0ccdfe8a7c057 (patch) | |
tree | 41b7e34059fd3fb4a7714b0b990fe9e8ef09384e /src/clojure/contrib/monads.clj | |
parent | f47197d0b901b6cd1756212df262e0bb0b70605e (diff) |
monads: added state-t monad transformer (by Jim Duey)
Diffstat (limited to 'src/clojure/contrib/monads.clj')
-rw-r--r-- | src/clojure/contrib/monads.clj | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/clojure/contrib/monads.clj b/src/clojure/contrib/monads.clj index 838a4221..b923d026 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 February 18, 2009 +;; last updated February 25, 2009 ;; Copyright (c) Konrad Hinsen, 2009. All rights reserved. The use ;; and distribution terms for this software are covered by the Eclipse @@ -384,3 +384,31 @@ (fn [xs] (apply concat (map f xs)))))) ])) + +;; Contributed by Jim Duey +(defn state-t + "Monad transformer that transforms a monad m into a monad of stateful + computations that have the base monad type as their result." + [m] + (monad [m-result (with-monad m + (fn m-result-state-t [v] + (fn [s] + (m-result (list v s))))) + m-bind (with-monad m + (fn m-bind-state-t [stm f] + (fn [s] + (m-bind (stm s) + (fn [[v ss]] + ((f v) ss)))))) + m-zero (with-monad m + (if (= ::undefined m-zero) + ::undefined + (fn [s] + m-zero))) + m-plus (with-monad m + (if (= ::undefined m-plus) + ::undefined + (fn [& stms] + (fn [s] + (apply m-plus (map #(% s) stms)))))) + ])) |