# Existential type

### From HaskellWiki

(Difference between revisions)

m |
EndreyMark (Talk | contribs) m (Syntax highlighting for Haskell examples) |
||

Line 1: | Line 1: | ||

'''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> | ||

class Shape_ a where | class Shape_ a where | ||

perimeter :: a -> Double | perimeter :: a -> Double | ||

Line 47: | Line 48: | ||

shapes :: [Shape] | shapes :: [Shape] | ||

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> | ||

[[Category:Idioms]] | [[Category:Idioms]] |

## Revision as of 10:52, 2 May 2006

**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 constructors -- 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]