sig module type S = sig type 'a t val bind : 'a t -> ('a -> 'b t) -> 'b t val return : 'a -> 'a t val failwith : string -> 'a t end end