+
+This is fun. Notice the difference it makes whether the second `++` is native to the outer `Monad.List`, or whether it's the inner `Monad.List`'s `++` hoisted into the outer wrapper:
+
+ # module LL = Monad.List.T(Monad.List);;
+
+ # LL.(run((++) (mid 1) (mid 2) >>= fun i -> (++) (mid i) (mid (10*i)) ));;
+ - : int LL.result = \[[1; 10; 2; 20]]
+ # LL.(run((++) (mid 1) (mid 2) >>= fun i -> hoist L.((++) (mid i) (mid (10*i)) )));;
+ - : int LL.result = [[1; 2]; [1; 20]; [10; 2]; [10; 20]]