2016-07-28 129 views
0

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

+1

您可以检查(通常是相当可读但uniquified命名)是GHC通过编译产生的衍生的实例代码与'-ddump-deriv'。查看GHC用户指南的6.13.1节,查看所有可以获得GHC的中间格式的列表。 –

回答

1

Eq返回的派生实例True两个对象xy如果两个以下为真:

  • xy通过相同的数据构造产生(并因此也具有相同的字段类型)
  • xy各个字段是彼此相等(经由它们的respecitve 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 
1

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

相关问题