【发布时间】:2016-10-19 05:58:29
【问题描述】:
我使用构造函数子类型构建了一个类型 Sup,它嵌入了另一个类型 t 的值。
data Sup t = ...
| Sub t
deriving Eq
因为Sup 省略的部分包含很多构造函数,没有一个使用t,我想派生 Eq (Sup t) 而不是手动实例。
类型约束 Eq t 现在已在 (==) 的实例上针对 Sup t:
(==) :: Eq t => Sup t -> Sup t -> Bool
谓词isSub :: Sup t -> Bool定义如下:
isSub :: Sup t -> Bool
isSub (Sub _) = True
isSub _ = False
借助这个谓词,我想定义以下运算符:
supEq :: Sup t -> Sup t -> Bool
supEq x y = not (isSub x) && not (isSub y) && x == y
GHC 不接受上述定义,因为缺少类型约束Eq t。但是,由于惰性求值,我知道 t 类型的值之间的相等性从未实际使用过。
有没有办法强制 GHC 忽略缺少的类型约束?
或者,有没有一种方法可以定义Sup 或supEq 以获得所需的结果:supEq 的定义无需在使用supEq 的任何地方传播冗余类型约束,而无需提供手册例如Eq (Sup t)。
【问题讨论】:
-
这个构造有什么用例?
-
所以你想让
supEq判断Sup a形式的两个值总是不相等,甚至supEq (Sub 1) (Sub 1) ≡ False?在问题中明确说明这一点可能会有所帮助。 -
我认为您可以使用 Data.Data.toConstr (请参阅hackage.haskell.org/package/base-4.9.0.0/docs/Data-Data.html)来获取使用的构造函数的表示形式并从那里构建。另见my previous answer to a similar-ish question/2630312#2630312
标签: haskell constraints ghc