Difference between revisions of "Existential type"
Jump to navigation
Jump to search
EndreyMark (talk | contribs) m (Syntax highlighting for Haskell examples) |
EndreyMark (talk | contribs) (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
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.
Generalised algebraic datatype
The type of the parser for 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):