我與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%清楚你想要做什麼。 –