# Existential type

### From HaskellWiki

(Difference between revisions)

EndreyMark (Talk | contribs) (Examples from the Generalised algebraic datatype page and from the Essential Haskell Compiler Project) |
EndreyMark (Talk | contribs) (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 ) may be confusing. In Essential Haskell, existential types can occur not only in data declarations, and a separate keywordforallis used for their notation.exists
- Essential Haskell Compiler overview
- Examples