gpt4 book ai didi

haskell - 在 Haskell 中覆盖 (==)

转载 作者:行者123 更新时间:2023-12-03 23:21:10 26 4
gpt4 key购买 nike

我有以下代数数据类型:

data Exp
= Con Int
| Var String
| Op Opkind Exp Exp
| Input
deriving (Show,Eq)

data Opkind
= Plus | Minus | Mult | Div | More | Equal
deriving (Show,Eq)

用简单的玩具语言表示表达式。

然而,因为我推导出 Eq, Op Plus (Var "a") (Var "b)不等于 Op Plus (Var "b") (Var "a")即使我想治疗 a+b作为 b+a 的等价表达式.

如何更改 (==)仅针对这些实例,无需指定 (==) 的行为对于所有其他情况?

最佳答案

您可以通过使 Exp 成为 Eq 的实例而不是派生 Eq 来实现这一点:

instance Eq Exp where
(Con a) == (Con b) = a == b
(Var a) == (Var b) = a == b
(Op Plus a b) == (Op Plus c d) = (a == c && b == d) || (a == d && c == b)
Input == Input = True
_ == _ = False

这将以想要的方式比较 Op Plus,但仍然缺少 Op 的其他情况。

编辑:

在 Op 上实现 (==) 的特殊情况而不丢失 Exp 上的派生的最简单方法,我想到的是这样的:
data Exp
= Con Int
| Var String
| EOp Op
| Input
deriving (Show, Eq)

data Op = Op Opkind Exp Exp deriving (Show)
instance Eq Op where
(Op Plus e1 e2) == (Op Plus e3 e4) = (e1 == e3 && e2 == e4) || ( e1 == e4 && e2 == e3)
(Op kind1 e1 e2) == (Op kind2 e3 e4) = and [kind1 == kind2, e1 == e3, e2 == e4]

关于haskell - 在 Haskell 中覆盖 (==),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5947340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com