1
fun a(list) = 
   let
   val num = length(hd(list))
   fun inner(list) = 
      if num = length(hd(list)) then
         if tl(list) = nil then true
         else inner(tl(list))
      else false
   in
   if length(hd(list))-1 = length(tl(list)) then inner(tl(list))
   else false
   end;

これはmlコードで、この警告とタイプが表示されます。

stdIn:6.16 Warning: calling polyEqual
val a = fn : ''a list list -> bool

警告についてわかりません。表示される理由とタイプ。''なぜそれが2つあるのですか?''?'リストリストと''リストリストの違いは何ですか?

4

3 に答える 3

5

ML Hintsからの抜粋:

Warning: calling polyEqual[発生する可能性があります] =2 つの値を多相型で比較するために使用するときはいつでも。

たとえば、と は多相型 を持つfun eq(x,y) = (x = y);ため、この警告が生成されxます。これはまったく問題なく、警告を無視してもかまいません。コード内のセマンティック エラーや型エラーは報告されません。多相型の 2 つの値が等しいかどうかを ML がテストする方法がわずかに非効率的である可能性があるため、コンパイラは警告を報告します。特に、等価性テストを実行するには、ランタイム システムはまず現在使用している値の型を判別し、次に値が等しいかどうかを判別する必要があります。最初の部分 (実行時の型のチェック) は、型が事前にわかっている場合 (テストして、y''a=3 = 4=テストは整数に適用されています)。ただし、これは ML のほとんどのユーザーが心配する必要があることではありません...

于 2012-09-16T04:16:23.360 に答える
3

To answer your second question,

why it has two '? ''? what is the difference between 'a list list and ''a list list?

''a is the same as 'a, but requires it to be an equality type. An equality type in SML is a type that can be compared using =. Non-equality types cannot be compared using =. When you create a datatype, you can specify whether it is an equality type or not.

于 2012-09-17T19:15:37.590 に答える