在Haskell中测试(Eq a)的类型

时间:2015-03-01 20:59:45

标签: haskell type-families

我正在试图看看我是否可以实现某些分支的类型是否实现Eq。

这是一次尝试:

data HTrue
data HFalse

type family Eq1 (a :: *) where
  Eq1 (Eq x) = HTrue
  Eq1 a = HFalse

你会注意到我把(a :: *)放在代码中。那是因为如果我没有,代码编译,但生成Eq1作为约束,而我实际上希望它是一个封闭类型的家庭。

有什么方法可以让它发挥作用吗?

1 个答案:

答案 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

并且不要导出构造函数。您必须始终指定要使用的版本,但这比依赖类实例更好。