尽管种类不同,但类型家庭注入违规

J. *_* M. 7 haskell type-families type-kinds

在以下示例中:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE PolyKinds #-}
newtype A a b = A (a, b)
type family F (x :: k) = (r :: k) | r -> x
type instance F (A a) = A a
type instance F (A a b) = A a b
Run Code Online (Sandbox Code Playgroud)

在我目前的理解中,第一个类型实例处理*->*kind,而第二个实例处理*.

因此,即使我使用相同的 newtype A,我也看不到任何注入性违规风险,因为绝对没有A a匹配 a ,A a b因为它们甚至没有相同的类型。

然而 GHC 8.6.5 抱怨这两种类型的实例违反了注入性,但这是为什么呢?有解决方法吗?