[英]Programming Associativity in haskell
所以这是我在这里的任务,我必须编写一些表达式的关联性,我在这工作了几个小时,我只是遗漏了一些明显的东西。 这是我的最后两个想法,两个有点工作,但不能正确评估真正的平等表达(第一个给出一个解析错误)我无法理解什么是错的。 救命 :(
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
您可能想要替换:
(==) (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
。
由于它是一项任务,将代码中的更改集成在一起,并重新组织它以使其工作,这仍然是一项练习。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.