我试图为语言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