La réponse de gasche est top. Je me permets juste d’ajouter quelques toutes petites notions autour du typage.
Déjà, il faut faire attention entre typage fort, et typage statique.
Un typage statique vs. un typage dynamique, c’est en gros si les types sont checkés à la compilation ou au runtime. Et c’est un peu ça que j’ai entendu parfois "non mais en Ruby du coup ça t’oblige à écrire des tests pour tout vérifier au runtime ! c’est bien que ça force à écrire des tests" 🤷🏻♂️
Un typage fort vs. un typage faible, c’est ce que tu décris (le fait que le type soit strict, et qu’on n’additionne pas des chaînes de caractères avec des nombres entiers).
Y’a quand même un truc que j’ajouterai là-dedans, c’est la puissance du système de types.
Si je prends par exemple Java, on pourrait se dire : c’est un typage statique et fort, parfait ! (bon, déjà fort c’est pas vraiment vrai hein y’a un fameux exemple avec String[] strs = {"aaa"};Object[] objs = strs; objs[0] = 3;
, et les génériques et l’effacement de types sont pourris, mais passons).
Pourtant, son système de types n’est pas puissant si on le compare à Haskell ou d’autres plus proches de lui comme Scala qui tourne sur la même plateforme. (composition de types, co/contra-variance, types de plus haut niveau, etc. y’a plein de comparaisons partout sur le net). Aussi, le fait que le système de type soit poussé / paranoïaque : évidemment fournir un type explicite pour la gestion des null, mais pas que, la possibilité d’encapsuler des effets (notamment les exceptions) facilement, pas forcément simple sans HKT/monades… Future[String]
ça permet de raisonner sur le fait que la chaîne de caractère est là ou pas encore là, IO[String]
ça permet de rendre explicite que y’a un effet derrière… Bref, écrire clairement "c’est pas vraiment une chaîne de caractère, c’est un truc avec lequel tu peux bosser, qui a plein de propriétés interessantes, mais pas celles d’une chaîne de caractère". Et au plus le système de types est puissant, au plus ces types IO
, Future
, Either
, Maybe
ont des propriétés intéressantes, au mieux on peut les "assembler" en quelques sortes.
Souvent, au plus le système de types est strict et statique, au plus il permet de faire des choses (parce qu’il est SÛR en fait) et s’il est statiquement typé, toutes ces choses seront faîtes à la compilation, c’est toujours ça de pris.
Un bon exemple que j’avais trouvé sur l’emploi concret d’un système de type avancé, c’est des gens qui avaient écrit (en Scala, il me semble) tout un système d’équation aux dimensions. En gros, le système de type se chargeait de vérifier qu’on pouvait ajouter une longueur avec une autre longueur (OK ça ça va), qu’en la divisant par une durée, on obtenait un truc homogène à un vitesse, elle-même divisible par du temps pour obtenir une accélération, elle même homogène à une force divisée par une masse, etc. etc. ici. On pourrait même faire encore beaucoup mieux, mais j’avais trouvé ça déjà assez convaincant.