
Hi I'm sorry about that, I should have check the last message runs, but I typed it from a computer that I don't develop on. The code below should run as I've tested it this time. newtype Parser a = P { parse :: (String -> [(a,String)]) } instance Monad Parser where return v = P (\s -> [(v,s)]) p >>= f = P (\s -> case parse p s of [] -> [] [(v,str)] -> parse (f v) str) fail _ = P (\_ -> []) item :: Parser Char item = P (\inp -> case inp of [] -> [] (x:xs) -> [(x,xs)]) p :: Parser (Char,Char) p = do { x <- item ; item ; y <- item ; return (x,y) } ---------------------------------------- For the record - the error in the last code I sent was that the newtype Parser has a different constructor name /P/ to its type name /Parser/ - I hadn't spotted that in the untested code. Apologies again Stephen