X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=code%2Fmonads.ml;h=7bb6894cda77723d028f216f38628a1c012c79ef;hp=2ba851b3bb904b7a9784a56e65178d02056f5ed3;hb=77808abfd2b5033980938ba74b82a733e36ed4e4;hpb=595509c48871d2cf8f420dc6cbb3668d21e85a61 diff --git a/code/monads.ml b/code/monads.ml index 2ba851b3..7bb6894c 100644 --- a/code/monads.ml +++ b/code/monads.ml @@ -602,6 +602,11 @@ end) : sig val throw : err -> 'a m val catch : 'a m -> (err -> 'a m) -> 'a m end + (* ErrorT transformer when wrapped monad has plus, zero *) + module TP : functor (Wrapped : Monad.P) -> sig + include module type of T(Wrapped) + include Monad.PLUS with type 'a m := 'a m + end module T2 : functor (Wrapped : Monad.S2) -> sig type ('x,'a) result = ('x,'a) Wrapped.result type ('x,'a) result_exn = ('x,'a) Wrapped.result_exn @@ -674,6 +679,15 @@ end = struct | Success _ -> Wrapped.unit t | Error e -> handler e) end + module TP(Wrapped : Monad.P) = struct + module TransP = struct + include T(Wrapped) + let plus u v = Wrapped.plus u v + let zero () = elevate (Wrapped.zero ()) + end + include TransP + include (Monad.MakeDistrib(TransP) : Monad.PLUS with type 'a m := 'a m) + end module T2(Wrapped : Monad.S2) = struct module Trans = struct module Wrapped = Wrapped