Skip to content

bjornkihlberg/chezscheme-monad

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 

Repository files navigation

chezscheme-monad

Haskell style do-notation in Chez Scheme


library (monad)

syntax <-

Auxiliary keyword for syntax monad.

syntax monad

Mimics Haskell's do-notation.

(monad flat-map e e* ...)
  • flat-map needs to be a valid flat map implementation
  • the last form in e e*... must be a valid monadic value
  • e may be a valid monadic value
  • e may be a monadic binding form (<- x mx) where
    • x is a bound variable
    • mx must be a valid monadic value
  • e may be a non-binding form
    • (let binding binding* ...) corresponds to (let (binding binding* ...) (monad flat-map e* ...))
    • (let* binding binding* ...) corresponds to (let* (binding binding* ...) (monad flat-map e* ...))
    • (letrec binding binding* ...) corresponds to (letrec (binding binding* ...) (monad flat-map e* ...))
    • (let-values binding binding* ...) corresponds to (let-values (binding binding* ...) (monad flat-map e* ...))
    • (let*-values binding binding* ...) corresponds to (let*-values (binding binding* ...) (monad flat-map e* ...))
  • e may be a named non-binding form
    • (let name binding binding* ...) corresponds to (let name (binding binding* ...) (monad flat-map e* ...))

Examples

flat-map implementations

(define none '#(none))

(define (option-flat-map f mx)
  (if (eq? mx none) mx (f mx)))
(define (list-flat-map f xs)
  (apply append (map f xs)))
(define (identity-flat-map f x) (f x))

identity

(monad option-flat-map 42)
; 42
(monad list-flat-map (list 1 2 3))
; (1 2 3)

monadic binding

(monad option-flat-map
  (<- x 5)
  (<- y 4)
  (+ x y))
; 9
(monad option-flat-map
  (<- x 5)
  (<- y none)
  (+ x y))
; #(none)
(monad list-flat-map
  (<- x (list 1 2 3))
  (<- y (list 4 5))
  (list (cons x y)))
; ([1 . 4] [1 . 5] [2 . 4] [2 . 5] [3 . 4] [3 . 5])

non-monadic binding

(monad option-flat-map
  (let [x 7]
       [y none])
  x)
; 7
(monad option-flat-map
  (let [x 7]
       [y none])
  y
  x)
; #(none)
(monad identity-flat-map
  (let loop [i 1] [acc 0])
  (if (<= i 10)
      (loop (add1 i) (+ acc i))
      acc))
; 55

About

Haskell style do-notation in Chez Scheme

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published