Ho appena finito learnyouahaskell l'altro giorno e stavo cercando di dare un senso alla restrizione del monomorfismo, come descritto dal Wiki di Haskell . Penso di capire come l'MR può impedire valutazioni ripetute, ma non riesco a capire perché tali valutazioni ripetute non possano essere evitate con mezzi molto più semplici.
L'esempio specifico che ho in mente è quello usato dal wiki:
f xs = (len,len)
where
len = genericLength xs
dov'è genericLengthdi tipo Num a => [b] -> a.
Ovviamente, genericLength xsdeve essere calcolato una sola volta per valutare (len,len), poiché è la stessa funzione con gli stessi argomenti. E non abbiamo bisogno di vedere invocazioni fper saperlo. Quindi perché Haskell non può fare questa ottimizzazione senza introdurre una regola come la MR?
La discussione su quella pagina wiki mi dice che ha qualcosa a che fare con il fatto che Numè una 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 vengono dati gli stessi argomenti due volte?
f [] :: (Int, Float). Ora ha perfettamente senso. Grazie.