6 polymorphism haskell typeclass higher-rank-types adhoc-polymorphism
我有一个可插入的运行时类型检查器,它支持参数但没有ad-hoc多态,因为没有编译步骤,一旦类型检查器被停用,类型信息就会被删除.
现在我最近提出了使用显式类型来实现类型类的想法,这样我就可以获得它们的一些优点,而无需将基础机制完全合并到类型检查器中:
data Functor f = Functor {fmap :: forall a b. (a -> b) -> f a -> f b}
mapList = Functor map
fmap (mapList) (+1) [1,2,3]
Run Code Online (Sandbox Code Playgroud)
似乎类型类可以使用rank-2类型进行模拟,至少在类型级别,因为当然,仍然没有静态调度.
我的假设是正确的,因为我是Haskell的新手,我的显式算子类型是否比直接使用更有优势map?
通过数据类型表示类的想法基本上是一个字典,实际上GHC实际上是如何实现类型类的:一个约束多态函数/值
f :: Functor f => Y
Run Code Online (Sandbox Code Playgroud)
在运行时由函数表示
_f_ :: FunctorDict f -> Y
Run Code Online (Sandbox Code Playgroud)
在哪里FunctorDict基本上是你的FunctorRank2-ADT(或GADT).
关于实际类型类的主要特点是这些字典具有单例属性:对于每个类型构造函数F,只能有一个instance Functor F,但原则上你可以有多个不同的FunctorDict F值.这实际上有时可能是一个优势,但通常它只是一个负担,因为你需要明确地携带这些字典(GHC可以自动选择它们,因为选择是明确的),并且更难陈述法律.