Error handling 如何处理这个错误?

Error handling 如何处理这个错误?,error-handling,functional-programming,ocaml,overflow,large-data,Error Handling,Functional Programming,Ocaml,Overflow,Large Data,我正在处理很长的列表和大树。 有时我会发现这个错误: 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

我正在处理很长的列表和大树。 有时我会发现这个错误:

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。 这次我在手术前运行了一些代码。如果我杀了当前的顶级球员,重新开始,手术就会开始

我的问题是: 1.这个错误到底是什么? 2.什么时候发生,如何发生? 3.为什么从一个新的顶层重新运行它会使它工作?
4.我该怎么处理呢

这是一个类型错误,不是运行时错误。它不需要任何费用,也与内存中结构的大小没有任何关系

如果您在顶层不小心,将两种不同类型的名称混合在一起,就会发生这种情况。比较:

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

这两种情况下发生的类型错误完全相同:您混合了不同的类型。但在第二种情况下,两者都有相同的名称t。类型系统试图提供帮助,并告诉您它内部分配给名称的唯一整数,以确保整个程序中确实存在唯一的整数

当以通常的方式编译程序时,这种错误不会发生在顶层之外,因为不可能在完全相同的路径上定义两个具有相同名称的类型


如何修复:如果使用与上一个定义不同的新定义重新定义类型,则必须小心地重新定义先前在toplevel中记录的此上一个类型上的操作。事实上,它们仍然是按旧类型键入的,与新类型一起使用会导致此类错误。

这是新类型吗?“我以前从未见过这种情况。”加斯奇:谢谢你的解释。这应该是问题所在。
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