(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))) ;; 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