2012-10-23 78 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