(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, "]