部分应用的等式约束

时间:2017-03-01 08:23:16

标签: haskell types type-constraints

请考虑以下事项:

class (a ~ b) => Equal a b
instance (a ~ b) => Equal a b

让我说我后来有一个数据类型:

data D (c :: * -> Constraint) where
  D :: Proxy c -> D c

然后这样的事情是有效的:

D (Proxy :: (Proxy (Equal Int)))

我的问题是,除了我用过的重复类/实例符号之外,还有什么方法可以编写Equal吗?

似乎当我将Equal定义为类型系列Equal Int时,它不起作用,因为它是一个不完整的应用程序。

类/实例黑客看起来很糟糕,但至少它有效,但还有其他可能更清晰的方法来实现这个吗?

注意我将在实际代码中使用比相等更复杂的约束,我只是认为这是一个很好的例子。

1 个答案:

答案 0 :(得分:4)

您根本不需要课程,只需在前缀表示法中使用(~)

GHC 8.0.1中存在一个有时会导致崩溃的错误,但它只是一个错误,并且已在8.0.2中修复。您正在描述的类/实例组合确实是此错误的有效解决方法。

如果您不需要向后兼容8.0.1,则可以直接使用(~) IntProxy ((~) Int)