Make2.M
(a,e) t is a type of monad, where a
is a type of computation values, and e
is a type of some extra information attached to the computation, usually a type of environment.
bind m f
passes the result of computation m
to function f
map function can be derived from bind or provided explicitly
val return : 'a -> ('a, _) t
return x
creates a trivial computation that results in x