Skip to main content
QUICK REVIEW

[论文解读] Haskell's overlooked object system

Oleg Kiselyov, Ralf Lämmel|ArXiv.org|Sep 10, 2005
Logic, programming, and type systems参考文献 49被引用 33
一句话总结

本论文表明,通过扩展常见的特性(如多参数类型类和函数依赖),Haskell 98 可以原生支持完整的面向对象编程——包括封装、继承、子类型、多态性以及可变状态——方法是借助 OOHaskell 库。其主要贡献在于证明了高级面向对象范式可直接映射到 Haskell 中,仅带来极少的语法摩擦,并保持强大的类型安全性,同时保留 Haskell 强大的类型推断能力。

ABSTRACT

Haskell provides type-class-bounded and parametric polymorphism as opposed to subtype polymorphism of object-oriented languages such as Java and OCaml. It is a contentious question whether Haskell 98 without extensions, or with common extensions, or with new extensions can fully support conventional object-oriented programming with encapsulation, mutable state, inheritance, overriding, statically checked implicit and explicit subtyping, and so on. We systematically substantiate that Haskell 98, with some common extensions, supports all the conventional OO features plus more advanced ones, including first-class lexically scoped classes, implicitly polymorphic classes, flexible multiple inheritance, safe downcasts and safe co-variant arguments. Haskell indeed can support width and depth, structural and nominal subtyping. We address the particular challenge to preserve Haskell's type inference even for objects and object-operating functions. The OO features are introduced in Haskell as the OOHaskell library. OOHaskell lends itself as a sandbox for typed OO language design.

研究动机与目标

  • 调查在使用常见扩展的 Haskell 98 中,是否能够无需新增语言扩展即可表达完整的面向对象编程。
  • 证明传统的面向对象特性(如继承、多态性、封装和可变状态)可以忠实地编码于 Haskell 中。
  • 表明 Haskell 的类型系统能够在保留类型推断能力的同时,支持诸如宽度子类型、深度子类型和协变参数子类型等高级子类型特性。
  • 确立 OOHaskell 作为一个实用的实验环境,用于探索带类型的面向对象语言设计,而无需修改编译器。
  • 解决长期以来关于 Haskell 类型类与面向对象编程中子类型多态性之间关系的争议。

提出的方法

  • 使用 HList 库将对象编码为可扩展的、一等的记录,该库提供具有子类型的异质、可内省的记录。
  • 通过多参数类型类与函数依赖来建模类、接口和继承层次结构。
  • 通过支持隐式多态性和开放递归的构造方法与对象生成器来实现对象构造。
  • 利用递归记录类型和类型级别编程,安全地建模自引用对象,并防止对未初始化状态的过早访问。
  • 通过动态类型检查和显式类型约束支持安全的下转型和上转型,尽可能在编译时捕获失败。
  • 通过类型级别对记录字段和方法类型的操控,支持灵活的多重继承以及名义型/结构型子类型。

实验结果

研究问题

  • RQ1在使用标准扩展的 Haskell 98 中,是否能够完全表达传统的面向对象特性,如继承、封装和子类型?
  • RQ2在编码复杂面向对象范式(如虚方法和可变状态)时,Haskell 的类型系统在多大程度上能保持类型推断和安全性?
  • RQ3如何在 Haskell 中安全且富有表现力地编码结构型和名义型子类型,包括宽度子类型和深度子类型?
  • RQ4是否可以在不使用语言扩展的情况下在 Haskell 中实现一等的词法作用域类和多态方法,它们与面向对象抽象的交互方式如何?
  • RQ5在类似 Haskell 的静态类型函数式环境中,是否能够支持安全的下转型和协变方法参数?

主要发现

  • 使用多参数类型类和函数依赖的 Haskell 98 已足够实现一个完整的面向对象系统,无需引入新的语言扩展。
  • OOHaskell 库支持将教科书中的面向对象代码逐行翻译为 Haskell,保留直觉和结构,无需全局程序变换。
  • 类型系统强制执行安全的下转型,不可能的转换会在编译时被标记为类型错误。
  • 该系统支持高级子类型特性,包括宽度子类型(字段增加)、深度子类型(继承)和协变方法参数。
  • 通过类型级别编程和基于 HList 的记录,原生支持一等的词法作用域类和隐式多态类。
  • 类型系统可自动推断异质对象集合的最不一般接口,通过半隐式的上转型实现对这些对象的统一处理。

更好的研究,从现在开始

从论文设计到论文写作,大幅缩短您的研究时间。

无需绑定信用卡

本解读由 AI 生成,并经人工编辑审核。