我与readsPrec的实施问题解析为以下数据结构的输入:哈斯克尔readsPrec有理函数
data Term = Monom Int Int
| Addition Term Term
| Subtraction Term Term
| Multiplication Term Term
| Division Term Term
我已经实现了节目的一个实例,它使得monom样子:
let k = Monom 2 3
Main.show k
回报:
(2x^3)
和
个let m = Addition k k
Main.show m
回报:
(2x^3)+(2x^3)
同时我围坐像5小时的任务,我真的没有任何线索如何处理它。我的第一种方法是这样的:
instance Read Term where
readsPrec _ inp = let[(a,b)] = lex inp in
case a of
"x" -> readsPrec 0 b
"^" -> [(Monom 1 (read b::Int), "")]
c -> let[(d, "")] = readsPrec 0 b in
[(Monom (read c::Int) ((\(Monom x y) -> y) d), "")]
起初,我觉得很开心,直到我发现这个代码不为别的比Monom工作。任何人都有更好的方法?
我建议你看看[这个答案](http://stackoverflow.com/a/6794085/1147955),并考虑只是'deriving'阅读和显示为您的数据类型。当然,你仍然可能想用比'Addition(Monom 1 3)(Monom 2 3)''更方便的格式解析输入(并显示输出)'。是这样吗?如果是这样,你可以使用一些解析器生成器或解析库,如Parsec。但它不是100%清楚你想要做什么。 –