Haskell has a sophisticated mechanism for overloading identiﬁers with multiple deﬁnitions at distinct types. Object-oriented programming has a similar notion of overriding and overloading for methods names. Unfortunately, it is not possible to encode object-oriented overloading directly using Haskell overloading. This deﬁciency becomes particularly tiresome when Haskell programs wish to call methods imported from an object-oriented library. We present two reﬁnements of Haskell’s type class system: Closed classes and overlapping instances. We demonstrate how we may exploit the reﬁned system so as to be able to encode object-oriented classes within Haskell. This encoding allows us to mimic, within Haskell, the overloading resolution rules employed by object-oriented languages without the need for additional type annotations or name mangling. As a consequence, object-oriented class libraries are very convenient to import and use within Haskell.
Errata (in both versions}
- Fig 2, page 14 (conference version) or page 12 (tech report version): the declaration
class SubE e
class (SubI e, SubJ e) => SubE e
Similarly, in the same Figure, the declaration for class SubF should read
class (SubE e) => SubF e
A technical report version of this paper is also available. 31 pages.