How to run Parser in chapter 8 Graham Hutton Haskell book

I am reading Chapter 8 of Programming Haskell by Graham Hutton and trying to run the code in the book. It seems that there are already defined library implementations of Parser so I used Parser' and generally ' on the end of each identifier to attempt to eliminate this problem. So the code I copied from the book is: type Parser' a = String -> [(a, String)] return' :: a -> Parser' a return' v = \x -> [(v, x)] failure' :: Parser' a failure' = \inp -> [] -- item doesn't seem to conflict with anything so no ' item :: Parser' Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x,xs)] parse' :: Parser' a -> String -> [(a, String)] parse' p inp = p inp p :: Parser' (Char, Char) p = do x <- item item y <- item return' (x,y) When run from WinGHCi I get error: prog_haskell.hs:458:9: Couldn't match type `[(Char, String)]' with `Char' Expected type: String -> [((Char, Char), String)] Actual type: Parser' ([(Char, String)], [(Char, String)]) In the return type of a call of return' In a stmt of a 'do' block: return' (x, y) In the expression: do { x <- item; item; y <- item; return' (x, y) } 458.9 is line at end with return' (x,y) Also in the chapter was the definition of >>= sequencing. as in: (>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>= f = \inp -> case parse p inp of [] -> [] [(v,out)] -> parse (f v) out But I assumed this would already be in standard Haskell library and so I didn't need to define. But even when I did add, still get same error. How do I fix this?

Hi, the Monad instance used for the do-notation of your parser p is that of the function type (Monad ((->) r)) due to your Parser' type synonym. This instance is not suitable. In p x and y get values of type [(Char, String)] via item, but you would want x and y to be of type Char. In order to fix it, you could desugar the do-Notation and use a proper replacement for >>=. (Alternatively, your Parser type could be turned into a proper data type with a proper Monad instance.) HTH Christian Am 03.01.2014 16:58, schrieb Angus Comber:
I am reading Chapter 8 of Programming Haskell by Graham Hutton and trying to run the code in the book.
It seems that there are already defined library implementations of Parser so I used Parser' and generally ' on the end of each identifier to attempt to eliminate this problem.
So the code I copied from the book is:
type Parser' a = String -> [(a, String)]
return' :: a -> Parser' a return' v = \x -> [(v, x)]
failure' :: Parser' a failure' = \inp -> []
-- item doesn't seem to conflict with anything so no ' item :: Parser' Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x,xs)]
parse' :: Parser' a -> String -> [(a, String)] parse' p inp = p inp
p :: Parser' (Char, Char) p = do x <- item item y <- item return' (x,y)
When run from WinGHCi I get error:
prog_haskell.hs:458:9: Couldn't match type `[(Char, String)]' with `Char' Expected type: String -> [((Char, Char), String)] Actual type: Parser' ([(Char, String)], [(Char, String)]) In the return type of a call of return' In a stmt of a 'do' block: return' (x, y) In the expression: do { x <- item; item; y <- item; return' (x, y) }
458.9 is line at end with return' (x,y)
Also in the chapter was the definition of >>= sequencing. as in:
(>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>= f = \inp -> case parse p inp of [] -> [] [(v,out)] -> parse (f v) out
But I assumed this would already be in standard Haskell library and so I didn't need to define. But even when I did add, still get same error.
How do I fix this?
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners

I found some notes on the authors website explaining that the book code would no longer work. So I downloaded two files: Parsing.lhs and parser.lhs. In WinGHCi I then issued :load on both files. parser.lhs contains a function, eval, as follows: <other stuff above>
eval :: String -> Int eval xs = case (parse expr xs) of [(n,[])] -> n [(_,out)] -> error ("unused input " ++ out) [] -> error "invalid input"
But in WinGHCi if I run: eval "2*3+4" I get error := Not in scope: `eval'
I assume this is some sort of namespaces feature of Haskell that I have not
read about? Or I somehow have to state what library modules to use??? Can
anyone help?
On 3 January 2014 15:58, Angus Comber
I am reading Chapter 8 of Programming Haskell by Graham Hutton and trying to run the code in the book.
It seems that there are already defined library implementations of Parser so I used Parser' and generally ' on the end of each identifier to attempt to eliminate this problem.
So the code I copied from the book is:
type Parser' a = String -> [(a, String)]
return' :: a -> Parser' a return' v = \x -> [(v, x)]
failure' :: Parser' a failure' = \inp -> []
-- item doesn't seem to conflict with anything so no ' item :: Parser' Char item = \inp -> case inp of [] -> [] (x:xs) -> [(x,xs)]
parse' :: Parser' a -> String -> [(a, String)] parse' p inp = p inp
p :: Parser' (Char, Char) p = do x <- item item y <- item return' (x,y)
When run from WinGHCi I get error:
prog_haskell.hs:458:9: Couldn't match type `[(Char, String)]' with `Char' Expected type: String -> [((Char, Char), String)] Actual type: Parser' ([(Char, String)], [(Char, String)]) In the return type of a call of return' In a stmt of a 'do' block: return' (x, y) In the expression: do { x <- item; item; y <- item; return' (x, y) }
458.9 is line at end with return' (x,y)
Also in the chapter was the definition of >>= sequencing. as in:
(>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>= f = \inp -> case parse p inp of [] -> [] [(v,out)] -> parse (f v) out
But I assumed this would already be in standard Haskell library and so I didn't need to define. But even when I did add, still get same error.
How do I fix this?
participants (2)
-
Angus Comber
-
Christian Maeder