我正在试图看看我是否可以实现某些分支的类型是否实现Eq。
这是一次尝试:
data HTrue
data HFalse
type family Eq1 (a :: *) where
Eq1 (Eq x) = HTrue
Eq1 a = HFalse
你会注意到我把(a :: *)放在代码中。那是因为如果我没有,代码编译,但生成Eq1作为约束,而我实际上希望它是一个封闭类型的家庭。
有什么方法可以让它发挥作用吗?
答案 0 :(得分:4)
在不同的上下文中可见的实例集也是不同的,因此任何这样的函数都是非常危险的。说真的,不要那样做。考虑定义两个这样的新类型:
module EqTest (HasEq, NoEq, hasEq, noEq, fromEq)
newtype HasEq a = HasEq a
newtype NoEq a = NoEq a
hasEq :: Eq a => a -> HasEq a
hasEq = HasEq
noEq :: a -> NoEq a
noEq = NoEq
class FromEq c where fromEq :: c a -> a
instance FromEq HasEq where fromEq (HasEq a) = a
instance FromEq NoEq where fromEq (NoEq a) = a
并且不要导出构造函数。您必须始终指定要使用的版本,但这比依赖类实例更好。