第一個方程,
parse ("+":s)(a:b:xs) = parse (s)((solve (Add (Number a) (Number b))):xs)
應該
parse ("+":s)(a:b:xs) = parse (s)((solve (Add a b)):xs)
,因爲每個類型簽名,a
和b
已經是Expression
秒。
或者,在與第二和第三方程線,所述類型更改爲
parse :: [String] -> [Rational] -> Double
和第一方程改變爲固定代碼的
parse ("+":s)(a:b:xs) = parse s ((a + b):xs)
兩種可能的方法(有是更有問題的部分):
-- Complete solve to handle all cases
solve :: Expression -> Expression
solve [email protected](Number _) = expr
solve (Add (Number x) (Number y)) = Number (x + y)
solve (Add x y) = solve (Add (solve x) (solve y))
-- Convert an Expression to Double
toDouble :: Expression -> Double
toDouble (Number x) = fromRational x
toDouble e = toDouble (solve e)
-- parse using a stack of `Expression`s
parse :: [String] -> [Expression] -> Double
parse ("+":s) (a:b:xs) = parse s ((solve (Add a b)):xs)
parse [] (answer:_) = toDouble answer
parse (x:xs) ys = parse xs (Number (toRational (read x :: Double)) : ys)
parse _ _ = 0
-- parse using a stack of `Rational`s
parseR :: [String] -> [Rational] -> Double
parseR ("+":s) (a:b:xs) = parseR s (a+b : xs)
parseR [] (answer:xs) = fromRational answer
parseR (x:xs) y = parseR xs ((toRational (read x::Double)):y)
parseR _ _ = 0
後者比較謹慎,因爲最終生成了Double
,所以使用Rational
作爲堆棧沒有真正的意義。
在您的parse
代碼,第三個方程省去了通過Number
構造一個Rational
到Expression
的轉換,但在其他方面正常。第二個公式,但是,含有不同類型的問題:
parse [] (answer:xs) = fromRational (toRational (read (show answer)::Float))
如果answer
或者是一個Expression
或Rational
,show answer
不能被解析爲一個Float
,這樣將導致一個運行時間錯誤,通過所例示您編輯:
(第二)錯誤是用解析功能無法處理
*Main> parse ["1","2","+"] [Number 3]
*** Exception: Prelude.read: no parse
在其中使用所述第二方程點,堆疊在所述第一元件(answer
)是Number (3 % 1)
,和show (Number (3 % 1))
是"Number (3 % 1)"
,其不是String
該read
可以作爲一個Float
解析。
你的第二個錯誤是在我的答案已經處理:) – 2012-04-26 18:43:15
是的,看來你已經搶佔這樣的事情,因爲我打字吧! – CSJC 2012-04-26 18:48:21