我想将AST声明为Eq的实例,但不想为每个构造函数重复相同的步骤(如果所有子项都相同,则2个expr相同)。所以第一个问题是GHC"衍生"足够?它有什么作用?如果没有,是否有一种避免重复的干净方法?也许通用编程?
答案 0 :(得分:1)
GHC的推导完全符合您的描述。给定数据类型data X = A ... | B ... | C ...
,当它们具有相同的构造函数时,它声明两个值相等,并且构造函数的所有参数也相等。这意味着每个构造函数的所有参数都必须有Eq
约束。如果它们是具体类型,那么如果找不到Eq
实例,则派生将在编译时失败。如果它们是变量,那么Eq
约束将被传递到instance
定义。
答案 1 :(得分:1)
Eq
的派生实例会为两个对象True
和x
返回y
,如果以下两个都为真:
x
和y
由同一数据构造函数生成(因此也包含相同类型的字段)x
和y
的相应字段彼此相等(通过其重新Eq
个实例)例如,考虑
data Maybe a = Nothing | Just a
派生的Eq
实例如下所示:
instance Eq a => Eq (Maybe a) where
Nothing == Nothing = True
(Just x) == (Just y) = x == y
_ == _ = False