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'è 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 invocazioni f
per 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.