1)
Les types Carre, Rectangle et Cercle peuvent être définis comme suit :
data Point = Point { x :: Double, y :: Double } deriving (Show)
data Carre = Carre { carreCentre :: Point, carreCote :: Double } deriving (Show)
data Rectangle = Rectangle { rectangleCentre :: Point, rectangleLongueur :: Double, rectangleLargeur :: Double } deriving (Show)
data Cercle = Cercle { cercleCentre :: Point, cercleRayon :: Double } deriving (Show)
2)
Les constructeurs de données pour les différents types peuvent être définis comme suit :
-- Constructeur de données pour Carre
creerCarre :: Double -> Point -> Carre
creerCarre cote centre = Carre centre cote
-- Constructeur de données pour Rectangle
creerRectangle :: Double -> Double -> Point -> Rectangle
creerRectangle longueur largeur centre = Rectangle centre longueur largeur
-- Constructeur de données pour Cercle
creerCercle :: Double -> Point -> Cercle
creerCercle rayon centre = Cercle centre rayon
3)
La classe de type FigureGeometrique peut être définie comme suit :
class FigureGeometrique a where
surface :: a -> Double
perimetre :: a -> Double
4)
Les instances de FigureGeometrique pour les types Carre, Rectangle et Cercle peuvent être définies comme suit :
-- Instance de FigureGeometrique pour Carre
instance FigureGeometrique Carre where
surface c = (carreCote c) ^ 2
perimetre c = 4 * (carreCote c)
-- Instance de FigureGeometrique pour Rectangle
instance FigureGeometrique Rectangle where
surface r = (rectangleLongueur r) * (rectangleLargeur r)
perimetre r = 2 * (rectangleLongueur r) + 2 * (rectangleLargeur r)
-- Instance de FigureGeometrique pour Cercle
instance FigureGeometrique Cercle where
surface c = pi * ((cercleRayon c) ^ 2)
perimetre c = 2 * pi * (cercleRayon c)
5)
La fonction evaluerSurfaces peut être définie comme suit :
evaluerSurfaces :: FigureGeometrique a => [a] -> [Double]
evaluerSurfaces = map surface