以下代码段使 GHC(使用 8.6.2 和 8.4.4 检查)在编译期间卡住:
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
import GHC.Exts (Constraint)
data T = T
type family F t (c :: * -> Constraint) :: Constraint
type instance F T c = c T
class F t C => C t where
t :: C T => t
t = undefined
我认为它被卡住了,因为t
GHC 试图找到C T
,这导致F T C
通过类型族扩展F
回C T
,这就是它正在寻找的(无限循环)。
我想理论上 GHC 可以说它C T
从自身达到了它的要求,并且任何依赖于自身的东西都可以递归地工作,还是我误解了什么?
旁注:在我偶然发现这种行为的真实示例中,我能够实现我想要的,而编译器不会被替换为UndecidableSuperClasses
卡住Data.Constraint.Dict
。