2012-10-23 52 views
-1

我试了几个小时,从现在开始到完成这个数据结构的定制阅读功能:哈斯克尔错误使用readsPrec时 - >无法匹配类型

data Term = Monom(Float, Integer) 
     | Addition(Term, Term) 
     | Subtraktion(Term, Term) 
     | Multiplikation(Term, Term) 
     | Division(Term, Term) 

读功能背后的想法是分析缀条款如(+ (+ 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] 

可悲的是,这并不工作,由于这个错误(这发生在加法和其他运营商):

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)以及如何以适当的方式解决它。

感谢您的帮助!

回答

1

readsPrec对于Term应该返回[(Term, String)]。所以你回到[Addition (res)],你需要[(Term, String)]但实际上有一个[Term]。请注意,参数也是错误的:res[(Term, String)],但在Addition(res)中,您需要它为(Term, Term),因此您需要稍后进行修复。

+0

感谢提示 - 你有一个快速提示如何解决这个问题?我真的不知道。 – muzy