On Thu, Oct 20, 2011 at 12:52 PM, Eric Tanter <[email protected]> wrote: > Thanks Sam, > > Actually, that's not what we're after. > > In untyped Racket, we have a struct monad: > > (struct monad > (;; A -> M A > return > ;; A -> (A -> M B) -> M B > bind)) > > Then we have several instantiations (exception, state, what-have-you): > (define my-fancy-monad (monad (lambda ...) (lambda ...)))
How do you protect against combing the Maybe monad's bind with the State monad's bind? Monads are more like objects where the methods have to take the same kind of thing, not just some higher level monad class. Jay > > It is feasible to type the particular instantiations (the return/bind > functions we need in each case), but we'd like to type the monad struct > itself. > The question is what to do about M? > > For now we're falling back on Any: > > (struct: monad ([return : Any] > [bind : Any])) > > Can we do better? > > I hope that's a bit clearer. > > Thanks, > > -- Éric > > On Oct 20, 2011, at 2:51 PM, Sam Tobin-Hochstadt wrote: > >> On Thu, Oct 20, 2011 at 10:45 AM, Eric Tanter <[email protected]> wrote: >>> Hi, >>> >>> Is there a way to type a monad? >>> >>> For example in OCaml: >>> >>> module type MonadRequirements = sig >>> type ‘a t >>> val bind : ‘a t -> (‘a -> ‘b t) -> ‘b t >>> val return : ‘a -> ‘a t >>> end;; >>> >>> In Typed Racket we can use a polymorphic struct to have the parametrization >>> by 'a and 'b, but is it possible to specify the abstract type constructor t? >> >> Types for monads will work just fine in Typed Racket. However, Typed >> Racket doesn't provide type abstraction over and above what plain >> Racket provides. You can use structs to ensure that instances of your >> monad aren't constructed except by `return' and `bind', just like you >> would in untyped Racket. >> >> Also, Racket doesn't have a notion of module interfaces, so there >> isn't a direct analog of how using 'module type' in OCaml works. >> >> Here's a module providing the identity monad in Typed Racket, with >> structures hiding the contents: >> >> #lang typed/racket >> (struct: (T) wrap ([v : T])) >> (define-type M wrap) >> (: return (All (T) T -> (M T))) >> (define (return x) (wrap x)) >> (: bind (All (T U) (M T) (T -> (M U))-> (M U))) >> (define (bind x f) (f (wrap-v x))) >> (provide M return bind) >> >> -- >> sam th >> [email protected] >> > > > _________________________________________________ > For list-related administrative tasks: > http://lists.racket-lang.org/listinfo/users > -- Jay McCarthy <[email protected]> Assistant Professor / Brigham Young University http://faculty.cs.byu.edu/~jay "The glory of God is Intelligence" - D&C 93 _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users

