请考虑以下事项:
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
时,它不起作用,因为它是一个不完整的应用程序。
类/实例黑客看起来很糟糕,但至少它有效,但还有其他可能更清晰的方法来实现这个吗?
注意我将在实际代码中使用比相等更复杂的约束,我只是认为这是一个很好的例子。
答案 0 :(得分:4)
您根本不需要课程,只需在前缀表示法中使用(~)
。
GHC 8.0.1中存在一个有时会导致崩溃的错误,但它只是一个错误,并且已在8.0.2中修复。您正在描述的类/实例组合确实是此错误的有效解决方法。
如果您不需要向后兼容8.0.1,则可以直接使用(~) Int
或Proxy ((~) Int)
。