aboutsummaryrefslogtreecommitdiff
path: root/examples.scm
blob: 1fd453c39ef824b68fd9e984cc130104dc049d21 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(add-to-load-path (dirname (current-filename)))

(use-modules (control monad)
             (data monoid)
             (data optional)
             (data writer))

;;; Optional Monad, and do notation

(do x <- (just 10)
    x) ; => 10

(do let y = (just 10)
    x <- y
    (+ x 5)) ; => 15

(do x <- (nothing)
    (+ x 5)) ; => [Nothing]

(do x <- (just 10)
    y <- (just 20)
    (+ x y)) ; => 30

;;; Writer Monad, and do notation

;; Int -> Writer Int String
(define (log-number n)
  (writer n (format #f "Got nuber: ~a" n)))

(do a <- (log-number 3)
    b <- (log-number 5)
    (writer (* a b) ""))
;; => [Writer 15, "Got nuber: 3, Got nuber: 5, "]