[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