我試圖爲語言E定義一個評估者,並且很坦率地說我完全處於一個茫然的狀態,不知道如何解決我一直在獲取的如何定義eval類型的所有錯誤。我花了幾個小時閱讀口譯員,monad,並試圖找到類似的東西給我一個基礎,但我什麼也沒有。這是家庭作業,所以自然不要直接給出答案。我現在最大的問題是Num E或Integral E沒有實例聲明,當我嘗試使用fromInt和fromNum來修復這個問題時,我遇到了更多的錯誤。我也嘗試將定義改爲各種不同的方式,主要問題是Int與E的類型不匹配。我覺得我錯過了一些非常基本的東西,但是我一直無法完全縮小它。如果我不清楚任何特定問題,我會很樂意回答任何其他問題。如果有任何消息來源是很好的附加信息,我真的很感激鏈接。Haskell迷你語言
data E = IntLit Int
| BoolLit Bool
| Plus E E
| Minus E E
| Multiplies E E
| Divides E E
| Equals E E
deriving (Eq, Show)
eval :: E -> E
--eval = undefined
eval (IntLit a) = IntLit a
eval (BoolLit a) = BoolLit a
eval (Plus a b) = eval a + eval b
eval (Minus a b) = eval a - eval b
eval (Multiplies a b) = eval a * eval b
eval (Divides a b) = eval a `div` eval b
eval (Equals a b) = BoolLit(a == b)
什麼都要你'EVAL 「真的嗎?也許快速看看這個問題/答案(擾流板:我 - 對不起)可以幫助你,因爲它似乎是在相同的方向:https://stackoverflow.com/questions/25968409/operations-with-user-defined-datatype/25969082#25969082 – Carsten 2014-10-05 19:39:34
順便說一句:我認爲最有可能的是你應該評估一個'Bool'或者一個'Int',如果你只是在子表達式和模式匹配上進行遞歸,你可以在'E'本身不使用'+它是評估(是一個「BoolLit」或「IntLit」或其他?我證明這是上面鏈接的答案。 – Carsten 2014-10-05 19:42:37
對eval的遞歸調用做得很好 - 你正在考慮沿着正確的路線,所以我因爲@CarstenKönig在那裏有一個很好的,詳細的答案,這就是你需要做的事情。 – AndrewC 2014-10-05 19:44:15