[Haskell-cafe] Thoughts on Haskell and OOP

Drew Vogel dvogel at intercarve.net
Sun Jan 4 20:47:53 EST 2009


I saw a blog entry once (sorry, google can't seem to find it now)
proposing the idea that OOP really is just language support for CPS
(continuation-passing-style). Does anyone have a link to this?

Drew


Kevin Van Horn wrote:
> Haskell has been around in one form or another for nearly two decades
> now, yet has never been extended with explicit support for
> object-oriented programming.  I've been thinking about why this is
> so.  I've come to the conclusion that Haskell simply doesn't need any
> explicit OOP support -- algebraic datatypes, modules, lazy evaluation,
> and first-class functions give you everything you need
> to do the kinds of things you would use classes and inheritance for in
> OO languages.
>
> To see why this is so, let's think about what OOP is.  At the most
> basic level we have what some call object-based programming.  This
> amounts to support for data hiding and abstract data types.  Haskell's
> module system handles this function quite well, without any need to
> introduce a special concept of "class" (in the OO sense) nor private
> vs. public class members.
>
> Object-oriented programming is then object-based programming plus
> class hierarchies and inheritance.  Why are these useful?
>
> Properly used, OOP is all about interface inheritance, not
> implementation inheritance.  (At least in C++, implementation
> inheritance -- inheriting the data members and method implementations
> of a base class -- usually leads to bad design, and is discouraged by
> the experts.)  (For those more familiar with Python, "duck typing" is
> the analog of interface inheritance for a dynamically-typed
> language.)  Interface inheritance allows you to write procedures that
> operate on the base-class interface, but can be applied to objects of
> any type derived from the base class.  Can we do this in Haskell?
>
> Yes, we can.  Let's consider the Haskell analog of an immutable C++
> base class:
>
>   struct Base {
>     virtual ~Base();
>     virtual int foo() const;
>     virtual int bar(int n) const;
>   };
>
>   class derived :: public Base {
>     ... data members ...
>   public:
>     derived(T_1 arg1, ..., T_k argk);
>     ... implementations of the virtual functions ...
>   };
>
> Haskell has no direct analog of object classes and virtual methods,
> but you can use lazy evaluation and first-class functions to achieve
> the same result:
>
>   data Base = Base { foo :: Int, bar :: Int -> Int }
>
>   derived :: T_1 -> ... -> T_k -> Base
>   derived a_1 ... a_k = Base { foo = ...; bar = bar } where bar n = ...
>
> The analog of a mutable C++ base class is a little bit more involved,
> but not much.  Suppose that we change bar(int) to be a mutating method
> in the C++ Base class:
>
>   virtual int bar(int n);
>
> The Haskell analog then changes to
>
>   data Base = Base { foo :: Int, bar :: Int -> (Int, Base) }
>
>   derived :: T_1 -> ... -> T_k -> Base
>   derived a_1 ... a_k = Base { foo = ...; bar = bar } where
>     bar n = (..., (derived a_1' ... a_k'))
>
> (Here a_1', ..., a_k' are k expressions involving n and a_1, ..., a_k.)
>
>
> What do the rest of you think?  Is my analysis correct?
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>   

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 258 bytes
Desc: OpenPGP digital signature
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20090104/92599c20/signature.bin


More information about the Haskell-Cafe mailing list