类型级别的类型 类 可以用更高级别的类型来模拟吗?

Can type classes at the type level be simulated with higher-rank types?

我有一个可插入的运行时类型检查器,它支持参数化但不支持临时多态性,因为没有编译步骤,类型检查器一停用类型信息就会被删除。

现在我最近想出了用显式类型具体化类型 类 的想法,这样我就可以获得它们的一些优势,而不必将底层机制完全纳入类型检查器:

data Functor f = Functor {fmap :: forall a b. (a -> b) -> f a -> f b}

mapList = Functor map
fmap (mapList) (+1) [1,2,3]

似乎类型 类 可以用 rank-2 类型模拟,至少在类型级别,因为,当然,仍然没有静态调度。

我的假设是否正确,因为我是 Haskell 菜鸟,我的显式函子类型是否比直接使用 map 有任何优势?

用数据类型表示 class 的想法基本上是一个 字典 ,实际上这几乎就是 GHC 实现类型 classes 的方式无论如何:一个受约束的多态 function/value

f :: Functor f => Y

在运行时由函数表示

_f_ :: FunctorDict f -> Y

其中 FunctorDict 本质上是您的 Functor Rank2-ADT(或 GADT)。

实际类型 classes 的主要特殊之处在于这些字典具有 单例 属性:对于每个类型构造函数 F, 永远只能有一个 instance Functor F,而原则上你可以有多个不同的 FunctorDict F 值。这有时实际上是一种优势,但通常它只是一种负担,因为你需要明确地随身携带这些词典(GHC 可以自动选择它们,因为选择是明确的),而且更难制定法律。