写一个不可满足的约束的好方法?

时间:2018-01-04 19:27:27

标签: haskell

我发现自己写了这个:

data T1
data T2

type Unsatisfiable = T1 ~ T2

所以我可以这样做:

type family NEq t1 t2 :: Constraint where
  NEq t t = Unsatisfiable
  NEq _ _ = ()

type HasProxyT t = NEq t (ProxyT t)

然后我可以使用HasProxyT来限制默认方法不循环,如果代理类型与它们自己相同(不会阻止两个实例循环到彼此的默认方法,但你必须是做这样的事非常愚蠢)。

但是Unsatisfiable的定义似乎有点难看?是否有一种更好的方法来定义Unsatisfiable或者这就是它的完成方式?

1 个答案:

答案 0 :(得分:9)

在GHC的最新版本中,您可以使用TypeError

import GHC.TypeLits 

type Unsatisfiable = TypeError ('Text "oops")

但是,我建议您直接在使用网站上使用TypeError并提供自定义错误消息:

type family NEq t1 t2 :: Constraint where
  NEq t t = TypeError ('Text "Expected a type distinct from " ':<>: 'ShowType t)
  NEq _ _ = ()