Haskell has a sophisticated mechanism for overloading identifiers with multiple definitions 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 deficiency becomes particularly tiresome when Haskell programs wish to call methods imported from an object-oriented library. We present two refinements of Haskell’s type class system: Closed classes and overlapping instances. We demonstrate how we may exploit the refined 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

    should read

      class (SubI e, SubJ e) => SubE e

    Similarly, in the same Figure, the declaration for class SubF should read

      class (SubE e) => SubF e

Other versions

A technical report version of this paper is also available. 31 pages.