简体   繁体   中英

Read in Haskell

It's possible to use the Scheme primitive read, which consumes a stream of characters and outputs an s-expression (sexpr).

I'm trying to write a parser in Haskell. What is the equivalent of the above? How would I implement it so that, if passed "{+ {- 3 4} 7}" it returns (list '+ (list '- 3 4) 7) (or the equivalent)?

Thanks in advance.

You'd be better off using a proper parsing library like uu-parsinglib , polyparse or parsec .

You can abuse Read to parse an arbitrary String into some data representation (which you'll have to define).

I think one of the first questions all those new to haskell should ask when they want to know "Can I do something?" is "What should the types be?". If you wanted to do what you're after, then I would suggest writing an AST like so:

data AST = Num Int
         | Add AST AST
         | Sub AST AST
         | Mul AST AST
         etc.

Then you could write a parser of potentially with the type:

parseAST :: String -> AST

To actually write this parser, you'll probably want to use something like parsec, though if the grammar is how you've described, then you could probably write your own parsed by hand that would work quite well (and help you learn).

From there, you can write functions that can evaluate the AST, or manipulate it however you like. But it is important to realise that you can't* create new code at runtime, because that's very likely to not be type safe, or safe at all.

* I'm sure there are ways to do this, but I felt that it was more important to foster the ideas that a beginning haskell programmer should learn before moving onto more advanced topics.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM