2010-12-01 15 views
24

¿alguien puede explicar, qué significa esta advertencia?advertencia en el ML

stdIn:18.35 Warning: calling polyEqual 

y por qué tengo "una y no 'a en la siguiente declaración:

val alreadyVisited = fn : ''a * ''a list -> bool 

esto es función de:

fun alreadyVisited(v, []) = false 
    | alreadyVisited(v, x::xs) = if(x=v) then true 
     else alreadyVisited(v, xs); 

gracias de antemano

Respuesta

42

'a medios "cualquier tipo", mientras que ''a significa "cualquier tipo que se pueda comparar por igualdad". ce su función alreadyVisited en comparación con x y v usando =, x y necesita tener un tipo que permita compararlas por igualdad, por lo que obtendrá el tipo ''a.

La advertencia significa que está comparando dos valores con tipo polimórfico para la igualdad.

¿Por qué esto produce una advertencia? Porque es menos eficiente que comparar dos valores de tipos conocidos para la igualdad.

¿Cómo se deshace de la advertencia? Al cambiar su función para que funcione solo con un tipo específico en lugar de cualquier tipo.

¿Le importa la advertencia? Probablemente no. En la mayoría de los casos, argumentaría que tener una función que pueda funcionar para cualquier tipo es más importante que tener el código más eficiente posible, así que simplemente ignoraría la advertencia.

+0

Recibo la misma advertencia en el caso, tal vez simplificado: 'fun something_fun ((* stuff *)) = [];' probablemente porque el compilador no puede inferir el tipo de una lista vacía. Poner, por ejemplo, una cadena en la lista hace que la advertencia desaparezca. – brntsllvn