Une raison cruciale pour l'utilisation explicite de rec
est de le faire avec Hindley-Milner, l'inférence de type, ce qui sous-tend tous les staticly tapé langages de programmation fonctionnelle (quoique modifié et étendu à diverses façons).
Si vous avez une définition let f x = x
, vous vous attendez à avoir le type 'a -> 'a
et pour être applicable sur différents 'a
types de points différents. Mais aussi, si vous écrivez let g x = (x + 1) + ...
, vous attendez x
à être traité comme un int
dans le reste du corps de l' g
.
Le chemin que Hindley-Milner inférence traite avec cette distinction est par le biais d'un explicite généralisation de l'étape. À certains points lors du traitement de votre programme, le type de système s'arrête et dit "ok, les types de ces définitions seront généralisés à ce point, de sorte que lorsque quelqu'un les utilise, gratuit et le type de variables dans leur type sera fraîchement instancié, et donc de ne pas interférer avec les autres utilisations de cette définition."
Il s'avère que l'endroit judicieux de faire cette généralisation est après vérification mutuellement récursives ensemble de fonctions. À une date antérieure, et vous aurez généraliser trop, conduit à des situations où des types fait entrer en collision. Un peu plus tard, et vous aurez généraliser trop peu, en faisant des définitions qui ne peut pas être utilisé avec plusieurs type d'instanciations.
Donc, étant donné que le type de vérificateur doit savoir au sujet de laquelle les ensembles de définitions sont mutuellement récursives, que peut-il faire? Une possibilité est de simplement faire une analyse de dépendance sur toutes les définitions de la portée, et les réorganiser dans le plus petit possible pour les groupes. Haskell en fait cela, mais dans des langues telles que F# (et OCaml et SML), qui ont sans restriction d'effets secondaires, c'est une mauvaise idée, car il pourrait réorganiser les effets secondaires trop. Donc, au lieu de cela, il demande à l'utilisateur de marquer explicitement dont les définitions sont mutuellement récursives, et donc, par extension, d'où la généralisation devrait se produire.