我发现自己写了这个:
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
或者这就是它的完成方式?
答案 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 _ _ = ()