0

私は非常に長いリストと大きなツリーを扱っています。
時々私はこのエラーを見つけるでしょう:

surgery a;;
Characters 8-9:
  surgery a;;
          ^
Error: This expression has type int t/1044
       but an expression was expected of type 'a t/1810
# type 'a t = | Leaf of ('a -> 'a -> int)
            | Node of 'a * 'a t * 'a t * ('a -> 'a -> int)

その種のエラーがどのタイプのものかはわかりませんが、ある種のオーバーフローだと思います。タイプは正しく一致しますが、タイプに続くバックスラッシュの後に大きな数字があります。この場合は 1044 と 1810です。
今回は の前にいくつかのコードを実行しsurgery aました。現在のトップレベルを殺して最初からやり直すと、surgery a実行されます。

私の質問は次のとおり
です。1.このエラーは正確には何ですか?
2. いつ、どのように発生しますか?
3. 新しいトップレベルから再実行すると機能するのはなぜですか?
4. どのように対処すればよいですか?

4

1 に答える 1

7

これは型エラーであり、実行時エラーではありません。「コスト」はかかりませんし、メモリ内にある構造のサイズとはまったく関係ありません。

トップレベルで注意を怠り、同じ名前の 2 つの異なるタイプを混在させた場合に発生します。比較:

type t = int;;
let f (x : t) = ();;
type u = bool;;
let g (y : u) = f y;;
                  ^
  Error: This expression has type u = bool
         but an expression was expected of type t = int

type t = int;;
let f (x : t) = ();;
type t = bool;;
let g (y : t) = f y;;
                  ^
  Error: This expression has type t/1047 = bool
         but an expression was expected of type t/1044 = int

これは、両方のケースで発生するまったく同じ入力エラーです。異なるタイプを混在させています。しかし、2 番目のケースでは、両方とも同じ名前tです。型システムは、プログラム全体で本当に一意であることを確認するために、名前に内部的に割り当てられた一意の整数について役立つように努めています。

まったく同じパスで同じ名前の 2 つの型を定義することはできないため、この種のエラーは (通常の方法でプログラムをコンパイルする場合に) トップレベルの外で発生することはありません。

修正方法: 以前のものと同等ではない新しい定義で型を再定義する場合は、以前にトップレベルに記録されたこの以前の型の操作も再定義するように注意する必要があります。実際、それらは依然として古い型を想定して型付けされており、新しい型でそれらを使用すると、そのようなエラーが発生します。

于 2013-03-19T05:56:55.530 に答える