Je viens juste de terminer Learnyouahaskell l'autre jour, et j'essayais de donner un sens à la restriction du monomorphisme, comme décrit par le Haskell Wiki . Je pense que je comprends comment le MR peut empêcher des évaluations répétées, mais je ne vois pas pourquoi ces évaluations répétées ne peuvent pas être évitées par des moyens beaucoup plus simples.
L'exemple spécifique que j'ai en tête est celui utilisé par le wiki:
f xs = (len,len)
where
len = genericLength xs
où genericLength
est de type Num a => [b] -> a
.
Évidemment, il genericLength xs
suffit de calculer une seule fois pour évaluer (len,len)
, car c'est la même fonction avec les mêmes arguments. Et nous n'avons pas besoin de voir d'invocations f
pour le savoir. Alors pourquoi Haskell ne peut-il pas faire cette optimisation sans introduire une règle comme le MR?
La discussion sur cette page wiki me dit que cela a quelque chose à voir avec le fait qu'il Num
s'agit d'une classe de caractères plutôt que d'un type concret, mais même ainsi, ne devrait-il pas être évident au moment de la compilation qu'une fonction pure retournerait la même valeur- -et donc le même type concret de Num - quand on lui donne deux fois les mêmes arguments?
f [] :: (Int, Float)
. Maintenant, c'est parfaitement logique. Je vous remercie.