• [^] # Re: Reason

    Posté par . En réponse à la dépêche OCaml 4.04 et 4.05. Évalué à 7.

    la sémantique objet est totalement différente entre Java et OCaml par exemple, car en OCaml, une classe héritant d'un autre n'est pas forcément son sous type.

    Ce qui est conforme à la nature des choses : l'héritage est une notion syntaxique et le sous-typage une notion sémantique.

    Par exemple, lorsque l'on écrit le syllogisme suivant:

    • tous les animaux sont mortels
    • or les hommes sont des animaux
    • donc les hommes sont mortels

    le concept « homme » est un sous-type du concept « animal » (ce qu'exprime la mineure). Malheureusement, les adeptes de la POO présentent souvent les concept de classes et d'héritage ainsi, ce qui est une erreur.

    Oleg Kyseliov a illustré, sur sa page Subtyping, Subclassing, and Trouble with OOP, le genre de bugs difficiles à détecter que cette confusion peut engendrer. Son exemple est en C++ (mais ça marche aussi en Java, Python...) et traite des ensembles (Set) comme sous-classe des multi-ensembles (Bag).

    Il faut prendre soin, dans la relation de sous-typage, des problématiques de covariance et de contravariance. Les règles de la relation de sous-typage sont exposées dans ce chapitre de Software Foundations de Benjamin C. Pierce. La première règle, par exemple, dite règle de subsomption :

    Gamma |- t : S S <: T
    -----------------------
     Gamma |- t : T
    

    est celle que l'on utilise dans le syllogisme :

    • tous le hommes sont mortels (homme <: mortel)
    • or Socrate est un homme (Socrate : homme)
    • donc Socrate est mortel (Socrate : mortel).

    La règle suivante, la règle structurelle, est celle qui est utilisée dans mon premier syllogisme avec les types animal, mortel et homme.

    S <: U U <: T
    ---------------
     S <: T
    

    Les problèmes de covariance et de contravariance arrivent lorsqu'il faut sous-typer des fonctions (méthodes dans les objets), dont la règle est :

    T1 <: S1 S2 <: T2
    ---------------------
    S1 -> S2 <: T1 -> T2
    

    autrement dit la flèche inverse la relation de sous-typage sur ses domaines (T1 <: S1), elle y est contravariante; tandis qu'elle la conserve sur ses codomaines (S2 <: T2), elle y est covariante.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.