Existential type
From HaskellWiki
(Difference between revisions)
m (Syntax highlighting for Haskell examples) |
(Examples from the Generalised algebraic datatype page and from the Essential Haskell Compiler Project) |
||
| Line 1: | Line 1: | ||
| + | __TOC__ | ||
| + | |||
| + | == 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. | ||
| Line 34: | Line 38: | ||
-- | -- | ||
| - | -- Smart | + | -- Smart constructor |
-- | -- | ||
| Line 49: | Line 53: | ||
shapes = [circle 2.4, rectangle 3.1 4.4, square 2.1] | shapes = [circle 2.4, rectangle 3.1 4.4, square 2.1] | ||
</haskell> | </haskell> | ||
| + | |||
| + | See also the concept of [[Smart constructor]]. | ||
| + | |||
| + | == [[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. | ||
| + | |||
| + | == Examples from the Essential Haskell Compiler Project == | ||
| + | |||
| + | See the documentations of the Essential Haskell Compiler project (at the ''Version 4'' part): | ||
| + | * [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] | ||
[[Category:Idioms]] | [[Category:Idioms]] | ||
Revision as of 11:39, 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 enlighten what the concept of existential type means.
3 Examples from the Essential Haskell Compiler Project
See the documentations of the Essential Haskell Compiler project (at the Version 4 part):
