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.It's the same function name, with the same arguments, but potentially different return types and implementations, because it's polymorphic.
Je pense que la meilleure façon de voir les choses est que l'instance de typeclass est effectivement un argument supplémentairegenericLength
et que le compilateur n'est pas convaincu que ce sont les mêmes arguments dans les deux appels.a = uncurry (==) $ f [1, 2, 3]
Serait-il capable d'optimiser ce site d'appel pour ne vérifier que la durée d'[1, 2, 3]
une fois? Si oui, alors je suis vraiment confus quant à ce que la restriction du monomorphisme vous achète réellement, sinon alors pourquoi pas?