diff options
author | Hugo Hörnquist <hugo@lysator.liu.se> | 2019-03-18 22:09:47 +0100 |
---|---|---|
committer | Hugo Hörnquist <hugo@lysator.liu.se> | 2019-03-18 22:09:47 +0100 |
commit | 7c53b9cd4793316a4a629e2527283e76883e9e8e (patch) | |
tree | d1ad224612888d96bbbfc5cbf4d4084b3bdb9058 | |
parent | Added some tests. (diff) | |
download | scheme-monad-7c53b9cd4793316a4a629e2527283e76883e9e8e.tar.gz scheme-monad-7c53b9cd4793316a4a629e2527283e76883e9e8e.tar.xz |
Update readme.
-rw-r--r-- | README.md | 51 |
1 files changed, 45 insertions, 6 deletions
@@ -1,10 +1,49 @@ Scheme Monads ============= -These are a proof of concept of Haskell style monads in scheme. -They currently support both bind (`>>=`) and `do` notation. +In an attempt to understand how Monads in Haskell actually works I set out to +reimplement them myself in scheme. -TODO ----- -- A propper way to call `return`. Probably by allowing bind to act as a macro - and introduce a return procedure of the appropriate type.
\ No newline at end of file +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. |