Scheme Monads
In an attempt to understand how Monads in Haskell actually works I set out to reimplement them myself in scheme.
Examples
(use-modules (monad)
(monad state))
(run-state (do x <- (<$> sqrt (get))
let y = (+ x 10)
(put y)
(return-state x))
64)
;; => (8 18)
(>> (just 1)
(just 2))
;; => [Just 2]
Unfortunately, it doesn't really short circuit as one would have hoped:
(>> (nothing) (just (/ 1 0)))
<unnamed port>:1520:36: Throw to key `numerical-overflow' with args `("/"
"Numerical overflow" #f #f)'.
Usage
The module (monad)
contains all base bindings, allowing usage of the monad system. The modules (monad *)
contains different data types, including optional, stacks, and more.
Documentation
Documentation can be build with
make doc
It however doesn't work to well, since the (texinfo reflection)
modules is less than perfect.
Tests & Examples
tests/test.scm
contains a few tests and examples of how to use the code.