diff options
Diffstat (limited to 'control/monad/procedures.scm')
-rw-r--r-- | control/monad/procedures.scm | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/control/monad/procedures.scm b/control/monad/procedures.scm index 4be85ae..707dc0b 100644 --- a/control/monad/procedures.scm +++ b/control/monad/procedures.scm @@ -1,16 +1,27 @@ (define-module (control monad procedures) #:use-module (oop goops) #:use-module (srfi srfi-1) ; concatenate! - #:export (>> >>=)) + #:export (>> >>= return)) + +(define-generic return) +(define-method (return (a <top>)) identity) +(define-method (return (a <pair>)) list) (define-generic >>=) +(define-method (>>= (a <top>) (proc <procedure>)) + (proc a)) + (define-method (>>= (this <null>) proc) '()) (define-method (>>= (this <pair>) (proc <procedure>)) (concatenate! (map proc this))) (define-generic >>) + +(define-method (>> (a <top>) (b <top>)) + (>>= a (lambda args b))) + (define-method (>> (a <null>) (b <null>)) '()) (define-method (>> (a <pair>) (b <null>)) '()) (define-method (>> (a <null>) (b <pair>)) '()) |