Ho appena finito learnyouahaskell l'altro giorno, e stavo cercando di dare un senso alla restrizione del monomorfismo, come descritto da Haskell Wiki . Penso di capire come il MR possa prevenire valutazioni ripetute, ma non riesco a capire perché quelle ripetute valutazioni non possono essere evitate con mezzi molto più diretti.
L'esempio specifico che ho in mente è quello usato dalla wiki:
f xs = (len,len)
where
len = genericLength xs
dove genericLength
è di tipo Num a => [b] -> a
.
Ovviamente, genericLength xs
deve essere calcolato una sola volta per valutare (len,len)
, poiché è la stessa funzione con gli stessi argomenti. E non abbiamo bisogno di vedere alcuna invocazione di f
per saperlo. Allora perché Haskell non può fare questa ottimizzazione senza introdurre una regola come MR?
La discussione su quella pagina wiki mi dice che ha qualcosa a che fare con il fatto che Num
è un typeclass piuttosto che un tipo concreto, ma anche così, non dovrebbe essere ovvio in fase di compilazione che una funzione pura restituirebbe lo stesso valore - e quindi lo stesso tipo concreto di Num - quando gli stessi argomenti vengono dati due volte?