可扩展的Haskell类型类

Ana*_*naK 15 haskell typeclass extensible

我正在阅读一篇关于依赖类型编程的论文,并且发现了以下引用:

"[...]与Haskell的类型类相比,数据类型[...]是封闭的 ",在某种意义上说,如果不扩展数据类型,就无法向Universe添加新类型.

我的新手问题是:Haskell类型类在什么意义上打开?它们如何可扩展?此外,拥有此属性(开放与封闭)的类型理论后果是什么?

谢谢!

Adr*_*ian 12

类型类是打开的,因为您可以使任意类型成为它的实例.创建类型类时,指定接口,但不指定属于它的类型.然后在包含类型类定义的任何代码中,您可以使用它的类型实例从界面使用instance TypeClass type of语法提供必要的函数.


Gab*_*lez 9

给定类型类:

class Monoid m where
    mempty  :: m
    mappend :: m -> m -> m
Run Code Online (Sandbox Code Playgroud)

...它(基本上)作为字典类型在引擎盖下实现:

data Monoid m = Monoid
    { mempty  :: m
    , mappend :: m -> m -> m
    }
Run Code Online (Sandbox Code Playgroud)

例如:

instance Monoid [a] where
    mempty  = []
    mappend = (++)
Run Code Online (Sandbox Code Playgroud)

...被翻译成词典:

listIsAMonoid :: Monoid [a]
listIsAMonoid = Monoid
    { mempty  = []
    , mappend = (++)
    }
Run Code Online (Sandbox Code Playgroud)

...当编译器使用容量为Monoids 时,编译器会查询字典.

这带给我们你的问题:

在什么意义上Haskell类型类打开?它们如何可扩展?

它们是开放的,就像多态值是开放的一样.我们有一些多态数据类型:

data Monoid m = ...
Run Code Online (Sandbox Code Playgroud)

...我们可以将多态m类型变量实例化为任何类型,我们可以为memptymappend字段提供合适的值.