(define-module (control monad procedures) #:use-module (oop goops) #:use-module (srfi srfi-1) ; concatenate! #:export (>> >>=)) (define-generic >>=) (define-method (>>= (this ) proc) '()) (define-method (>>= (this ) (proc )) (concatenate! (map proc this))) (define-generic >>) (define-method (>> (a ) (b )) '()) (define-method (>> (a ) (b )) '()) (define-method (>> (a ) (b )) '()) (define-method (>> (a ) (b )) (concatenate! (map (constant b) a))) ;; 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