使用readsPrec时的Haskell错误 - >无法匹配类型

时间:2012-10-23 08:07:06

标签: haskell types input instance

我从现在开始尝试几个小时来为这个数据结构实现自定义读取功能:

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

readsPrec

Term应该返回[(Term, String)]。因此,在您返回[Addition (res)]的位置,您需要[(Term, String)],但实际上有[Term]。请注意,参数也是错误的:res[(Term, String)],但在Addition(res)中您需要它(Term, Term),因此您需要稍后修复它。 / p>