繁体   English   中英

编程在haskell中的关联性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM