2010-12-01 25 views
24

quelqu'un peut-il expliquer, que signifie cet avertissement?avertissement dans le ML

stdIn:18.35 Warning: calling polyEqual 

et pourquoi dois-je un » et non pas « une dans la déclaration suivante:

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

c'est fonction:

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

merci à l'avance

Répondre

42

'a moyens "n'importe quel type", tandis que ''a signifie "tout type qui peut être comparé pour l'égalité". ce votre alreadyVisited fonction comparé x et v en utilisant , et v besoin d'avoir un type qui prend en charge les comparant pour l'égalité, de sorte que vous obtenez le type ''a. L'avertissement signifie que vous comparez deux valeurs de type polymorphe pour l'égalité.

Pourquoi cela génère-t-il un avertissement? Parce que c'est moins efficace que de comparer deux valeurs de types connus pour l'égalité.

Comment vous débarrasser de l'avertissement? En changeant votre fonction pour travailler uniquement avec un type spécifique au lieu de n'importe quel type.

Si vous vous souciez de l'avertissement? Probablement pas. Dans la plupart des cas, je dirais qu'il est plus important d'avoir une fonction qui peut fonctionner pour n'importe quel type que d'avoir le code le plus efficace possible, donc j'ignorerais l'avertissement.

+0

Je reçois le même avertissement dans le cas, peut-être simplifié,: 'fun some_fun ((* stuff *)) = [];' probablement parce que le compilateur ne peut pas déduire le type d'une liste vide. Mettre, disons, une chaîne dans la liste fait disparaître l'avertissement. – brntsllvn