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@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?