Personal tools

Existential type

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Examples from the Generalised algebraic datatype page and from the Essential Haskell Compiler Project)
(Existential types in Essential Haskell. Comparisons to Haskell.)
Line 3: Line 3:
 
== Dynamic dispatch mechanism of OOP ==
 
== Dynamic dispatch mechanism of OOP ==
   
'''Existential types''' in conjunction with type classes can be used to emulate the dynamic dispatch mechanism of object oriented programming languages. To illustrate this concept I show how a classic example from object oriented programming can be encoded in Haskell.
+
'''Existential types''' in conjunction with type classes can be used to emulate the dynamic dispatch mechanism of object oriented programming languages. To illustrate this concept I show how a classic example from object oriented programming can be encoded in Haskell.
   
 
<haskell>
 
<haskell>
Line 58: Line 58:
 
== [[Generalised algebraic datatype]] ==
 
== [[Generalised algebraic datatype]] ==
   
The type of the parser for [[Generalised algebraic datatype#Motivating example|this GADT]] is a good example to enlighten what the concept of existential type means.
+
The type of the parser for [[Generalised algebraic datatype#Motivating example|this GADT]] is a good example to illustrate the concept of existential type.
   
== Examples from the Essential Haskell Compiler Project ==
+
== Examples from the [http://www.cs.uu.nl/wiki/Ehc/ Essential Haskell Compiler] project ==
   
See the documentations of the Essential Haskell Compiler project (at the ''Version 4'' part):
+
See the [http://www.cs.uu.nl/wiki/Ehc/#On_EHC documentation on EHC], each paper at the ''Version 4'' part:
  +
* Chapter 8 (EH4) of Atze Dijksta's [http://www.cs.uu.nl/groups/ST/Projects/ehc/ehc-book.pdf Essentai Haskell PhD thesis] (most recent version). A detailed explanation. It explains also that existential types can be expressed in Haskell, but their use is restricted to data declarations, and the notation (using keyword <hask>forall</hask>) may be confusing. In Essential Haskell, existential types can occur not only in data declarations, and a separate keyword <hask>exists</hask> is used for their notation.
 
* [http://www.cs.uu.nl/wiki/pub/Ehc/WebHome/20050107-eh-intro.pdf Essential Haskell Compiler overview]
 
* [http://www.cs.uu.nl/wiki/pub/Ehc/WebHome/20050107-eh-intro.pdf Essential Haskell Compiler overview]
 
* [http://www.cs.uu.nl/wiki/Ehc/Examples#EH_4_forall_and_exists_everywher Examples]
 
* [http://www.cs.uu.nl/wiki/Ehc/Examples#EH_4_forall_and_exists_everywher Examples]

Revision as of 16:11, 2 May 2006

Contents


1 Dynamic dispatch mechanism of OOP

Existential types in conjunction with type classes can be used to emulate the dynamic dispatch mechanism of object oriented programming languages. To illustrate this concept I show how a classic example from object oriented programming can be encoded in Haskell.

 class Shape_ a where
   perimeter :: a -> Double
   area      :: a -> Double
 
 data Shape = forall a. Shape_ a => Shape a
 
 type Radius = Double
 type Side   = Double
 
 data Circle    = Circle    Radius
 data Rectangle = Rectangle Side Side
 data Square    = Square    Side
 
 
 instance Shape_ Circle where
   perimeter (Circle r) = 2 * pi * r
   area      (Circle r) = pi * r * r
 
 instance Shape_ Rectangle where
   perimeter (Rectangle x y) = 2*(x + y)
   area      (Rectangle x y) = x * y
 
 instance Shape_ Square where
   perimeter (Square s) = 4*s
   area      (Square s) = s*s
 
 instance Shape_ Shape where
   perimeter (Shape shape) = perimeter shape
   area      (Shape shape) = area      shape
 
 
 --
 -- Smart constructor
 --
 
 circle :: Radius -> Shape
 circle r = Shape (Circle r)
 
 rectangle :: Side -> Side -> Shape
 rectangle x y = Shape (Rectangle x y)
 
 square :: Side -> Shape
 square s = Shape (Square s)
 
 shapes :: [Shape]
 shapes = [circle 2.4, rectangle 3.1 4.4, square 2.1]

See also the concept of Smart constructor.

2 Generalised algebraic datatype

The type of the parser for this GADT is a good example to illustrate the concept of existential type.

3 Examples from the Essential Haskell Compiler project

See the documentation on EHC, each paper at the Version 4 part:

  • Chapter 8 (EH4) of Atze Dijksta's Essentai Haskell PhD thesis (most recent version). A detailed explanation. It explains also that existential types can be expressed in Haskell, but their use is restricted to data declarations, and the notation (using keyword
    forall
    ) may be confusing. In Essential Haskell, existential types can occur not only in data declarations, and a separate keyword
    exists
    is used for their notation.
  • Essential Haskell Compiler overview
  • Examples