X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=state_monad_tutorial.mdwn;h=b15ac297c192d40e5336fd8bc672f975aab63a23;hp=bac9124e828bfd6a571ffe0fd8c48591510afa53;hb=0514157d311eae9ec04606dc4b3e6a68038f3186;hpb=e4a25b6b413f5e536393226994c171685e50c797 diff --git a/state_monad_tutorial.mdwn b/state_monad_tutorial.mdwn index bac9124e..b15ac297 100644 --- a/state_monad_tutorial.mdwn +++ b/state_monad_tutorial.mdwn @@ -95,13 +95,13 @@ If we wanted to work with one of the encapsulation techniques described above, w 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: @@ -134,7 +134,7 @@ or, using pattern-matching on the record (you don't have to specify every field 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: @@ -170,7 +170,7 @@ What are the special-purpose operations that the `State_monad` module defines fo ... >> 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 >>= ...