干净的方式来得到Eq

时间:2016-07-28 00:33:18

标签: haskell typeclass

我想将AST声明为Eq的实例,但不想为每个构造函数重复相同的步骤(如果所有子项都相同,则2个expr相同)。所以第一个问题是GHC"衍生"足够?它有什么作用?如果没有,是否有一种避免重复的干净方法?也许通用编程?

2 个答案:

答案 0 :(得分:1)

GHC的推导完全符合您的描述。给定数据类型data X = A ... | B ... | C ...,当它们具有相同的构造函数时,它声明两个值相等,并且构造函数的所有参数也相等。这意味着每个构造函数的所有参数都必须有Eq约束。如果它们是具体类型,那么如果找不到Eq实例,则派生将在编译时失败。如果它们是变量,那么Eq约束将被传递到instance定义。

答案 1 :(得分:1)

Eq的派生实例会为两个对象Truex返回y,如果以下两个都为真:

  • xy由同一数据构造函数生成(因此也包含相同类型的字段)
  • xy的相应字段彼此相等(通过其重新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