## Monads in Scheme - Update

#### by Tony Garnock-Jones / @leastfixedpoint

Just quickly revisiting the article the other day on monads
in Scheme: I've just updated my experimental implementation
to propagate monad type information both forward from the arguments to
the result of the bind operation and backward from the expected result
type to the required argument types of the bind. Now Oleg's
example (see near the bottom of the page, where there's an
expression `(put-line "Enter a number: ")`

) can be
translated into the following working code:

(define oleg-example-mixed-monad (mlet* ((_ (mdisplay "Enter a number: ")) (n mread) (all-n (return (iota n))) (evens (return (run-list (mlet* ((i all-n)) (if (even? i) (return i) (fail "odd")))))) (_ (mdisplay "Computed ")) (_ (mdisplay (length evens))) (_ (mdisplay " evens\n"))) (return evens)))

When run with `(run-io oleg-example-mixed-monad)`

, it
produces sessions like the following (user input in *italics*):

Enter a number:33Computed 17 evens (0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32)

The system could be sweetened up with a bit of generic-function or other OO sugar, but I'd say even without extra sugar that this experiment has been successful in demonstrating the feasibility of the technique. It looks like I'll be able to use the idea for structuring effects in ThiNG.