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 :
>>> 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
[^] # Re: A force...
Posté par kantien . En réponse au journal Typage statique pour Python. Évalué à 1.
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
modet la comparaison à0ne fonctionnent que sur les typesintet donc le système d'inférence identifie que les paramètres de la fonction sont nécessairement de typeint.Néanmoins on peut définir une module qui implémente le type polynôme avec sa propre fonction
modet sa valeurzero.Pour reprendre le cas du
pgcdsi je compare la valeur à un float comme0.0le système se plaindra :Pour comparer avec python :
là où avec l'inférence de type l'erreur sur
gest determiné statiquement à la compilationSapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.