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

标签 haskell polymorphism typeclass higher-rank-types adhoc-polymorphism

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

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

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 有任何优势?直接地?

最佳答案

用数据类型表示一个类的想法基本上是一个字典,实际上这几乎是 GHC 实现类型类的方式:一个受约束的多态函数/值

f :: Functor f => Y

在运行时由函数表示
_f_ :: FunctorDict f -> Y

在哪里 FunctorDict本质上是您的Functor Rank2-ADT(或 GADT)。

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

关于haskell - 类型级别的类型类可以用更高级别的类型来模拟吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48720939/

相关文章:

matlab - 如何在 MATLAB 中创建抽象类对象数组?

haskell - 我什么时候应该通过类型类或其他方式定义多态函数?

parsing - Haskell 中的 AST 和解析

haskell - 对于高性能应用服务器,我应该选择Yesod的Warp和snap-server中的哪一个?

function - Haskell:函数应该接收的类型为 "how much"?并避免完整的 "reconstruction"

haskell - 使用具有 'limited' 约束的约束种类和类型族

java - Java中具有不同引用类型的对象类型有什么优点?

c++ - 如果基类析构函数是虚拟的,则派生类的析构函数默认是虚拟的吗?

typeclass - Rust:使用特征/类型类来实现通用数字函数

haskell - 无法从上下文中推导出 (Eq a) (...)