[Haskell-cafe] Object-oriented programming, Haskell and existentials

oleg at okmij.org oleg at okmij.org
Wed Oct 15 06:05:51 EDT 2008


Lennart Augustsson wrote:
> I was just pointing out that the mechanism for doing the OO thing
> exists in Haskell too, albeit looking a little different.

Indeed there is a mechanism for doing OO in Haskell -- several of
them. Most of them have nothing to do with Existentials. In the 
OHaskell paper,

	http://homepages.cwi.nl/~ralf/OOHaskell/

Ralf Laemmel has collected all known to us methods of doing OO in
Haskell. Incidentally, three years ago Lennart Augustsson described a
simple, Haskell98 method of emulating OO, without existentials. We
give him credit in footnote 4.

The OOHaskell paper then goes to demonstrate how to do *all* of the
known OO in Haskell, with all its inherent complexity: depth and width
subtyping, upcasting and safe downcasting, nominal and structural
subtyping, and the whole issue about covariant methods.

Derek Elkins wrote:
> In general, to encode OO you need quite a bit more than existentials.
> As you are probably aware, there was a cottage industry in the mid to
> late '90s working on encodings of OO languages into System F + foo
> calculi.  They just about gave up on a complete encoding until someone
> figured one out.  'turns out all you needed was recursive bounded
> existential quantification.

Not necessarily. Again, please see the OOHaskell paper. The full story
is that there are several encodings of objects -- using closures and
using existentials. The former are *far* simpler. ML-ART (which later
evolved in the 'O' of OCaml) chose the more complex encoding -- and
hence had to add equi-recursive types, existentials and universals to
Caml -- only because of a potential safety issue with closures. A
constructor of an object may invoke methods that may access fields
that are not initialized yet. This problem is present in all OO
languages, and the common `solution' is an admonition ``not to do
that''. Clearly Didier Remy has higher standards, and he went into
considerable pain to solve the problem. Incidentally, Haskell can
solve this problem in a simpler way. We critically rely on the fact
that all effects must be done in a monad. Therefore, in OOHaskell we
can safely use the simpler encoding for objects.

Regarding existentials, the web page
	http://okmij.org/ftp/Computation/Existentials.html

demonstrates how to systematically eliminate existentials. In fact,
the object encoding via existentials can be easily transformed into
the encoding that uses only simple, first-order types. The web page
begs a question if there is ever any real need for existentials.



More information about the Haskell-Cafe mailing list