所以这是我在这里的任务,我必须编写一些表达式的关联性,我在这工作了几个小时,我只是遗漏了一些明显的东西。 这是我的最后两个想法,两个有点工作,但不能正确评估真正的平等表达(第一个给出一个解析错误)我无法理解什么是错的。帮助:(
data Expr = Const Int | Add Expr Expr deriving Show
instance Num Expr where
fromInteger = Const . fromInteger
(+) = Add
-- I have to write here
instance Eq Expr where
(Const i) == (Const j) = i == j
(Add i j) == (Add a b) = i == a && j == b || i ==b && j == a
(==) (Add e3 (Add e1 e2)) (Add (Add e4 e5) e6) =
(Add(Add e1 e2) e3)==(Add e1 (Add e2 e3))
_ == _ = False
答案 0 :(得分:4)
您可能想要替换:
(==) (Add e3 (Add e1 e2)) (Add (Add e4 e5) e6) = (Add(Add e1 e2) e3)==(Add e1 (Add e2 e3))
通过
(==) (Add e1 (Add e2 e3)) e = (Add(Add e1 e2) e3) == e
(==) e (Add e1 (Add e2 e3)) = e == (Add(Add e1 e2) e3)
每个等式只是重新平衡一个表达式树以获得左递归,而不试图检查表达式是否实际上等于,所以你需要第三个等式:
(==) (Add e1 e2 ) (Add e3 e4) = (e1 == e3) && (e2 == e4)
然后我定义了一个函数,它明确地将Expr
作为参数来测试(==)
:
testexpr :: Expr -> Expr -> Bool
testexpr a b = a == b
和testexpr (1 + (2 +3)) ((1 + 2) + 3)
会产生True
。
由于它是一项任务,因此将代码中的更改集成在一起,并对其进行重新组织以使其正常工作留作练习。