我从现在开始尝试几个小时来为这个数据结构实现自定义读取功能:
data Term = Monom(Float, Integer)
| Addition(Term, Term)
| Subtraktion(Term, Term)
| Multiplikation(Term, Term)
| Division(Term, Term)
read函数背后的想法是解析像(+ (+ Monom Monom) Monom)
这样的中缀术语。现在我尝试了Monoms,其中2
这样的数字转换为Monom(2,0)
,而不是像2x^5
那样会转换为Monom(2,5)
的数字。
instance Read Term where
readsPrec _ inp = let [(a,b)] = lex inp in
case a of
-- these are control characters for making the input look nicer
"(" -> readsPrec 0 b
")" -> readsPrec 0 b
" " -> readsPrec 0 b
-- end character -> nothing to do here
"" -> []
-- operators
"+" -> let res = readsPrec 0 b in [Addition(res)]
"-" -> let res = readsPrec 0 b in [Subtraktion(res)]
"*" -> let res = readsPrec 0 b in [Multiplikation(res)]
"/" -> let res = readsPrec 0 b in [Division(res)]
-- monom
c -> let res = readsPrec 0 b in [Monom(read c::Float,0),res]
遗憾的是,由于此错误(在Addition和其他运算符中发生),这不起作用:
Couldn't match expected type `(Term, String)'
with actual type `Term'
In the return type of a call of `Addition'
In the expression: Addition (res)
In the expression: [Addition (res)]
您能否提供一些如何修复来源的提示?我不知道为什么期望的类型是(Term,String)
以及如何以适当的方式修复它。
感谢您的帮助!
答案 0 :(得分:1)
readsPrec
的 Term
应该返回[(Term, String)]
。因此,在您返回[Addition (res)]
的位置,您需要[(Term, String)]
,但实际上有[Term]
。请注意,参数也是错误的:res
是[(Term, String)]
,但在Addition(res)
中您需要它(Term, Term)
,因此您需要稍后修复它。 / p>