X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?a=blobdiff_plain;f=code%2Fmonads.ml;h=10ef808eb1d025132bedc605551e79a11f919d56;hb=6de2bd8209fa3f253373924a1723f6f98b6dfeff;hp=3fba1f3216414caa0419bc04527f7bb6b2f64cbb;hpb=47b863bd1121e6f1617da773dc36253b8f6f4215;p=lambda.git diff --git a/code/monads.ml b/code/monads.ml index 3fba1f32..10ef808e 100644 --- a/code/monads.ml +++ b/code/monads.ml @@ -55,9 +55,11 @@ * derived from) *) -exception Undefined (* Some library functions used below. *) + +exception Undefined + module Util = struct let fold_right = List.fold_right let map = List.map @@ -78,14 +80,13 @@ module Util = struct let undef = Obj.magic (fun () -> raise Undefined) end - - (* * This module contains factories that extend a base set of * monadic definitions with a larger family of standard derived values. *) module Monad = struct + (* * Signature extenders: * Make :: BASE -> S @@ -342,6 +343,7 @@ module List_monad : sig val permute : 'a m -> 'a m m val select : 'a m -> ('a * 'a m) m *) + val expose : ('x,'a) m -> ('x,'a list) Wrapped.m end end = struct module Base = struct @@ -412,6 +414,7 @@ end = struct let permute : 'a m -> 'a m m let select : 'a m -> ('a * 'a m) m *) + let expose u = u end end @@ -530,6 +533,7 @@ module Reader_monad(Env : sig type env end) : sig val ask : ('x,env) m val asks : (env -> 'a) -> ('x,'a) m val local : (env -> env) -> ('x,'a) m -> ('x,'a) m + val expose : ('x,'a) m -> env -> ('x,'a) Wrapped.m end end = struct type env = Env.env @@ -568,6 +572,7 @@ end = struct let asks selector = ask >>= (fun e -> try unit (selector e) with Not_found -> fun e -> Wrapped.zero ()) + let expose u = u end end @@ -593,6 +598,8 @@ module State_monad(Store : sig type store end) : sig val gets : (store -> 'a) -> ('x,'a) m val put : store -> ('x,unit) m val puts : (store -> store) -> ('x,unit) m + (* val passthru : ('x,'a) m -> (('x,'a * store) Wrapped.result * store -> 'b) -> ('x,'b) m *) + val expose : ('x,'a) m -> store -> ('x,'a * store) Wrapped.m end end = struct type store = Store.store @@ -637,6 +644,8 @@ end = struct with Not_found -> Wrapped.zero () let put s = fun _ -> Wrapped.unit ((), s) let puts modifier = fun s -> Wrapped.unit ((), modifier s) + (* let passthru u f = fun s -> Wrapped.unit (f (Wrapped.run (u s), s), s) *) + let expose u = u end end @@ -968,6 +977,7 @@ module Tree_monad : sig (* note that second argument is an 'a tree?, not the more abstract 'a m *) (* type is ('a -> 'b W) -> 'a tree? -> 'b tree? W == 'b treeT(W) *) val distribute : ('a -> ('x,'b) Wrapped.m) -> 'a tree option -> ('x,'b) m + val expose : ('x,'a) m -> ('x,'a tree option) Wrapped.m end end = struct type 'a tree = Leaf of 'a | Node of ('a tree * 'a tree) @@ -1026,7 +1036,9 @@ end = struct end include BaseT let distribute f t = mapT (fun a -> elevate (f a)) t zero plus + let expose u = u end + end;;