什麼我目前要做的是創建一個名爲Value
類型:匹配預期型
data Value = Num Int
| Sum Int Int
| Dif Int Int
| Neg Int
deriving (Eq)
與我要實現一個eval函數:
eval :: Value -> Int
eval (Num x) = x
eval (Sum x y) = x + y
eval (Dif x y) = x - y
eval (Neg x) = -x
我的預期結果應該是:
eval $ Dif (Sum (Num 3) (Num 6)) (Neg 4)
> 13
與我目前的代碼我能夠測試每個操作員themselve他們的功能。
eval (Dif 3 4)
>-1
當我嘗試在預期輸入進行嵌套操作上面,我再拿到錯誤的問題出現了:
"Couldn't match expected type
Int
with actual typeValue
"
我想,因爲我以爲我的操作來理解問題應該返回一個Int
,因爲我的Value
類型採用Int
,下一個操作應該具有預期的類型。我一直在測試各種輸入,看看有什麼我目前的eval函數實際上做的和發現,如果我做
eval (Dif (eval (Sum 3 5)) 4)
>4
我得到預期的結果。我在這裏做錯了什麼?
你爲什麼要把'Value'放到需要'Int'的東西里? 'Sum(Num 1)(Num 2)''不起作用,因爲'Num 1 :: Value'但'Sum'需要'Int'。 – AJFarmar
除了你得到的正確答案之外,你可能想要考慮讓'Value'成爲'Num'的一個實例 - 這樣你就可以編寫'1 :: Value'。 – Alec
我完全忽略了,我實際上正在使用Value類型;我錯誤的思維AJFarmer(我會責怪它缺乏睡眠)。我的文章被編輯了,但我是Haskell的新手,所以我屈服於簡單的錯誤。感謝亞歷克的提示! – Sinsarii