部分应用等式约束
Partially applied equality constraint
考虑以下几点:
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)))
我的问题是,除了我使用的重复 class/instance 符号之外,还有什么方法可以编写 Equal
吗?
似乎当我将 Equal
定义为类型族时 Equal Int
不起作用,因为它是一个不完整的应用程序。
class/instance hack 看起来很糟糕,但至少它有效,但是有没有其他可能更简洁的方法来实现这一点?
请注意,我将在实际代码中使用比等式更复杂的约束,我只是认为这是一个很好的例子。
你根本不需要 class,你可以在前缀符号中使用 (~)
。
GHC 8.0.1 有一个错误,有时会导致崩溃,但这只是一个错误,在 8.0.2 中已修复。您描述的 class / 实例组合确实是解决此错误的有效方法。
如果不需要向后兼容8.0.1,可以直接使用(~) Int
或Proxy ((~) Int)
。
考虑以下几点:
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)))
我的问题是,除了我使用的重复 class/instance 符号之外,还有什么方法可以编写 Equal
吗?
似乎当我将 Equal
定义为类型族时 Equal Int
不起作用,因为它是一个不完整的应用程序。
class/instance hack 看起来很糟糕,但至少它有效,但是有没有其他可能更简洁的方法来实现这一点?
请注意,我将在实际代码中使用比等式更复杂的约束,我只是认为这是一个很好的例子。
你根本不需要 class,你可以在前缀符号中使用 (~)
。
GHC 8.0.1 有一个错误,有时会导致崩溃,但这只是一个错误,在 8.0.2 中已修复。您描述的 class / 实例组合确实是解决此错误的有效方法。
如果不需要向后兼容8.0.1,可以直接使用(~) Int
或Proxy ((~) Int)
。