aboutsummaryrefslogtreecommitdiff
path: root/control/monad/procedures.scm
diff options
context:
space:
mode:
Diffstat (limited to 'control/monad/procedures.scm')
-rw-r--r--control/monad/procedures.scm17
1 files changed, 17 insertions, 0 deletions
diff --git a/control/monad/procedures.scm b/control/monad/procedures.scm
new file mode 100644
index 0000000..701f871
--- /dev/null
+++ b/control/monad/procedures.scm
@@ -0,0 +1,17 @@
+(define-module (control monad procedures)
+ #:use-module (oop goops)
+ #:use-module (srfi srfi-1) ; concatenate!
+ #:export (>>=))
+
+(define-generic >>=)
+
+(define-method (>>= (this <null>)
+ proc)
+ '())
+(define-method (>>= (this <pair>)
+ (proc <procedure>))
+ (concatenate! (map proc this)))
+
+;; bind :: Monad m => m a -> (a -> m b) -> m b
+;; return :: Monad m => a -> m a
+;; map :: Functor f => (a -> b) -> f a -> f b