Difference between revisions of "Existential type"
Jump to navigation
Jump to search
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]