4

私は次の再帰関数を持っています:

fun tester (f:'a -> 'b, tl:(string * 'a * 'b) list) =
    case tl of
    [] => []
     | (t, c, e)::rest => 
       let val tr = f (c)
       in
           if tr <> (e)
           then ((t), (e), tr)::(tester (f, rest))
           else tester (f, rest)
       end;

ロードすると、「エラー:演算子とオペランドが一致しません[UBOUND一致]」が表示されます。

lec1test.sml:17.5-19.26 Error: operator and operand don't agree [UBOUND match]
  operator domain: ''Z * ''Z
  operand:         'b * 'Y
  in expression:
    tr <> e

uncaught exception Error
  raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20

trの一般的なバインディングに何かがあると思いますが、なぜそれが問題になるのかわかりません。trからの関数の値に割り当てています。これは。fを返します'b。次に、結果をタプルの最後の値と比較します。これもタイプ'bです。誰かがこれが私にエラーを与えている理由を説明できますか?

4

1 に答える 1

11

すべての型が等式演算子=をサポートしているわけではなく<>、いわゆる等式型のみをサポートしています。たとえば、またははint等式型string listですが、関数を比較するための合理的な(決定可能な)方法がないため、bool * unitたとえば関数型は決してそうではありません。t -> u

'a型変数は任意の型でインスタンス化できるため、のようなポリモーフィック型の値も等価型ではありません。等式型に制限されたポリモーフィック型を取得するには、二重目盛りの型変数を記述する必要があります''a

あなたの場合、最初の行をに変更します

fun tester (f : ''a -> ''b,  tl : (string * ''a * ''b) list) =

あなたのためにそれを修正する必要があります。

于 2013-01-20T13:05:25.297 に答える