+Notice that an `('a, M) stateT` is not an `'a M state`. The pattern by which the types are transformed from an Blah monad to a BlahT monad transformer is:
+
+ 't0 ---> 't0 M
+ 't1 -> 't0 ---> 't1 -> 't0 M
+ ('t1 -> 't0) -> 't0 ---> ('t1 -> 't0 M) -> 't0 M
+
+Here's how this works for List and ListT:
+
+ (* monadic operations for the List monad *)
+
+ (* type 'a list is already pre-defined *)
+
+ let unit (a : 'a) : 'a list =
+ [a];;
+
+ let bind (u : 'a list) (f : 'a -> 'b list) : 'b list =
+ (fun v -> List.concat (List.map f v)) u
+
+ (* monadic operations for the ListT monadic transformer *)
+
+ type ('a, M) listT =
+ 'a list M;;
+
+ let unit (a : 'a) : 'a list =
+ [a];;
+
+ let bind (u : 'a list) (f : 'a -> 'b list) : 'b list =
+ (fun v -> List.concat (List.map f v)) u
+
+