2010-12-01 25 views
24

誰かが説明してください、この警告はどういう意味ですか?MLの警告

stdIn:18.35 Warning: calling polyEqual 

、なぜ私が「「Aを持っていない次のステートメントで:

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

これは機能:事前に

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

おかげ

答えて

42

'a手段「任意のタイプ」であり、''aは「同等性のために比較できるタイプ」を意味します。あなたのalreadyVisitedの機能を比較すると、xvを使用すると、=,xおよびvには、同等性を比較するための型が必要であるため、タイプは''aになります。

この警告は、2つの値をポリモーフィック型と比較することを意味します。

なぜ警告が表示されますか?これは、既知の型の2つの値を等しいかどうか比較するよりも効率が悪いためです。

警告をどのように取り除きますか?任意のタイプではなく、特定のタイプでのみ機能するように関数を変更します。

警告にご注意ください。おそらくそうではありません。ほとんどの場合、私は、最も効率的なコードを可能にするよりも、あらゆるタイプのために働くことができる関数を持つことが重要だと主張します。そのため、警告を無視します。

+0

コンパイラが空のリストの型を推論することができないため、おそらく単純化されたケースでは、 'fun some_fun((* stuff *))= [];'という同じ警告が表示されます。リストに文字列を置くと、警告が消えます。 – brntsllvn