[Haskell-beginners] How to run Parser in chapter 8 Graham Hutton Haskell book
Angus Comber
anguscomber at gmail.com
Fri Jan 3 17:43:59 UTC 2014
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 <anguscomber at gmail.com> wrote:
> 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?
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20140103/71465d9a/attachment-0001.html>
More information about the Beginners
mailing list