(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 (do (just 10) (nothing) (just 20)) ; => [Nothing] ;;; 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, "] (do (log-number 3) (log-number 5)) ;; => [Writer 5, "Got nuber: 3Got nuber: 5"]