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, _) treturn x creates a trivial computation that results in x