Acabo de terminar learnyouahaskell el otro día, y estaba tratando de entender la Restricción de Monomorfismo, tal como lo describe el Wiki de Haskell . Creo que entiendo cómo el MR puede evitar evaluaciones repetidas, pero no logro ver por qué esas evaluaciones repetidas no se pueden evitar por medios mucho más directos.
El ejemplo específico que tengo en mente es el que usa la wiki:
f xs = (len,len)
where
len = genericLength xs
donde genericLength
es del tipo Num a => [b] -> a
.
Obviamente, genericLength xs
solo se debe calcular una vez para evaluar (len,len)
, ya que es la misma función con los mismos argumentos. Y no necesitamos ver ninguna invocación de f
para saberlo. Entonces, ¿por qué Haskell no puede hacer esta optimización sin introducir una regla como la MR?
La discusión en esa página wiki me dice que tiene algo que ver con el hecho de que Num
es una clase de tipos en lugar de un tipo concreto, pero aun así, ¿no debería ser obvio en tiempo de compilación que una función pura? devolvería el mismo valor, y por lo tanto el mismo tipo concreto de Num, cuando se le den los mismos argumentos dos veces?