For anyone else benefit, this is how I fixed issue.

1. download Parsing.lhs from author's website.
2. Also download parser.lhs and paste contents into my prog_haskell.hs file, removing text comments and > symbols.
3. At top of my prog_haskell.hs file you need import Parsing

You can then call the functions in WinGHCi, eg eval "3+5*2"

For some reason I was not able to work out how to import both Parsing.lhs and parser.lhs together.  Will have to read up on modules later.



On 7 January 2014 11:43, Christian Maeder <Christian.Maeder@dfki.de> wrote:
Hi Angus,

did you get an answer for your question? (Just pressing "reply" only answers to the list, as happened to my earlier answer to your initial question.)

I don't know if WinGHCi works like ghci under linux (and I don't know which files Parsing.lhs and parser.lhs you tried to load.)

At the ghci Prompt you can type ":browse" to see which names are in scope. Maybe parser.lhs could not be loaded for some reason that I cannot reproduce. (Maybe eval is explicitly not exported?)

Cheers Christian


Am 03.01.2014 18:43, schrieb Angus Comber:
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
<mailto: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?




_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://www.haskell.org/mailman/listinfo/beginners