Send Beginners mailing list submissions to beginners@haskell.org To subscribe or unsubscribe via the World Wide Web, visit http://www.haskell.org/mailman/listinfo/beginners or, via email, send a message with subject or body 'help' to beginners-requ...@haskell.org
You can reach the person managing the list at beginners-ow...@haskell.org When replying, please edit your Subject line so it is more specific than "Re: Contents of Beginners digest..." Today's Topics: 1. Re: Parser as an instance of the monad class (Brent Yorgey) ---------------------------------------------------------------------- Message: 1 Date: Wed, 12 Jan 2011 08:49:20 -0500 From: Brent Yorgey <byor...@seas.upenn.edu> Subject: Re: [Haskell-beginners] Parser as an instance of the monad class To: beginners@haskell.org Message-ID: <20110112134920.ga...@seas.upenn.edu> Content-Type: text/plain; charset=us-ascii On Tue, Jan 11, 2011 at 11:39:48PM -0800, Paul Higham wrote: > I am working my way through Graham Hutton's book and find that his > approach to introducing monads is rather nice. Trouble is that the > code there does not work "out of the book". Specifically, if you > define the Parser type as follows: > > type Parser a :: String -> [(a,String)] > > you can then define the return and bind functions as > > return v = \x -> [(v,x)] > p >>= f = \x -> case p x of > [] -> [] > [(v,y)] -> (f v) y > > but you get name conflicts with the functions of the same names in > the Prelude. Fair enough. > > There are a number of ugly things that you can do at this point that > are just plain wrong, so I thought that the right thing to do would > be to get the Parser type to be manifested as an instance of the > Monad class. Ok, now what? Since Parser is only a type synonym it > cannot be used directly in the following way: > > instance Monad Parser where > return v = . . . > p >>= f = . . . > > but since Parser is not an algebraic type as it is defined that won't > work either. So how do you do it? help . Make Parser a newtype, like so: newtype Parser a = Parser (String -> [(a, String)]) Now you will have some extra Parser constructors to deal with, but you can make this an instance of Monad just fine. -Brent ------------------------------ _______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners End of Beginners Digest, Vol 31, Issue 11 *****************************************