aboutsummaryrefslogtreecommitdiff
path: root/control/monad/procedures.scm
blob: 2c25d578dcfc349be351457b1f901b89af884029 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(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)))

(define-generic >>)
(define-method (>> (a <null>) (b <null>)) '())
(define-method (>> (a <pair>) (b <null>)) '())
(define-method (>> (a <null>) (b <pair>)) '())
(define-method (>> (a <pair>) (b <pair>))
  (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