• [^] # Re: A force...

    Posté par . En réponse au journal Typage statique pour Python. Évalué à 1.

    Mais que se passe-t-il si je donne à la fonction pgcd sans annotations des objets pour lesquels sont définis les opérations mod et comparaison à 0 (une classe polynôme par exemple) ? Est ce que le systême d'inférence va me mettre des bâtons dans les roues parce qu'il a fait de mauvaise hypothèses ?

    En OCaml il n'y as pas de typeclasses comme en Haskell (il y a des travaux pour rajouter cela au langage) et on ne peut pas surcharger les opérateurs. Les opération mod et la comparaison à 0 ne fonctionnent que sur les types int et donc le système d'inférence identifie que les paramètres de la fonction sont nécessairement de type int.

    ( mod );;
    - : int -> int -> int = <fun>
    0;;
    - : int = 0

    Néanmoins on peut définir une module qui implémente le type polynôme avec sa propre fonction mod et sa valeur zero.

    Pour reprendre le cas du pgcd si je compare la valeur à un float comme 0.0 le système se plaindra :

    let rec pgdc a b =
     match a mod b with
     | 0. -> b
     | r -> pgcd b r
    ;;
    Error: This pattern matches values of type float 
     but a pattern was expected which matches values of type int

    Pour comparer avec python :

    >>> def f(i):
    ... print("l'entier %i" % i)
    ... 
    >>> f(2)
    l'entier 2
    >>> def g():
    ... f("a")
    ... 
    >>> g()
    Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "<stdin>", line 2, in g
     File "<stdin>", line 2, in f
    TypeError: %i format: a number is required, not str
    

    là où avec l'inférence de type l'erreur sur g est determiné statiquement à la compilation

    let f i = Printf.printf "l'entier %i" i;;
    val f : int -> unit = <fun>
    f 2;;
    l'entier 2- : unit = ()
    let g () = f "a";;
    Error: This expression has type string but an expression was expected of type int

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