Authors
Mark Shields and Simon Peyton Jones
Abstract
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 explore various encodings of object-oriented
classes into Haskell, demonstrate precisely where Haskell's existing type
class system is unsatisfactory, and propose two refinements. We proceed in
three stages. Firstly, we discuss various ways of accommodating
sub-typing; we conclude that a simple
encoding using Haskell classes is better for our purpose than a more
substantial language extension. Second, we introduce a new notion of
closed class, and show how this enables
improvement of constraints beyond what
is possible in Haskell. Closed classes make it easy to encode the truely ad
hoc overloading of object-oriented methods without the need for name
mangling or gratuitous type annotations. Thirdly, we allow
overlapping instances, and define what
it means for one instance to be better than another. This mechanism will
turn out to mimic the rather complex overloading resolution rules used by
object-oriented languages to select the
most-specific method at a call site. In the Appendix, we present type
checking and inference rules, as well as details of constraint entailment
and simplification. However, this workshop paper is somewhat exploratory:
the design may shift once we gain experience with an implementation, and we
have not devoted any time to showing any formal properties of our system.
Full Text
[pdf]