Here is how you'd have to do it using our OCaml monad library:
- # use "path/to/monads.ml";;
+ # #use "path/to/monads.ml";;
# module S = State_monad(struct type store = store' end);;
# let increment_store'' : ('x,'a) S.m =
S.(get >>= fun cur ->
let value = cur.total
- in let s = { total = succ cur.total; modifications = succ cur.modifications }
- in put s >> unit value);;
+ in let s' = { total = succ cur.total; modifications = succ cur.modifications }
+ in put s' >> unit value);;
Let's try it out:
let { total = value; _ } = s0
in (value, { total = s0.total + 2; modifications = s0.modifications + 2};;
-But **the point of learning how to do this monadically** is that (1) monads show us how to embed more sophisticated programming techniques, such as imperative state and continuations, into frameworks that don't natively possess them (such as the set-theoretic metalanguage of Groenendijk, Stockhof and Veltman's paper); and (2) monads are delicious.
+But **the point of learning how to do this monadically** is that (1) monads show us how to embed more sophisticated programming techniques, such as imperative state and continuations, into frameworks that don't natively possess them (such as the set-theoretic metalanguage of Groenendijk, Stokhof and Veltman's paper); (2) becoming familiar with monads will enable you to see patterns you'd otherwise miss, and implement some seemingly complex computations using the same simple patterns (same-fringe is an example); and finally, of course (3) monads are delicious.
Keep in mind that the final result of a bind chain doesn't have to be the same type as the starting value:
... >> put new_store >> fun () -> ...
- As that code snippets suggests, the boxed value after the application of `puts new_store` is just `()`. If you want to preserve the existing boxed value but replace the store, do this:
+ As that code snippet suggests, the boxed value after the application of `puts new_store` is just `()`. If you want to preserve the existing boxed value but replace the store, do this:
... >>= fun value -> put new_store >> unit value >>= ...