如何处理这个错误?

时间:2013-03-19 05:06:11

标签: 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 'a * 'a t * 'a t * ('a -> 'a -> int)

我不确定这种错误是什么类型,但我想这是某种溢出。类型匹配正确,但在类型后面的反斜杠后面有大数字。在这种情况下,1044和1810 这次我在surgery a之前运行了一些代码。如果我杀死当前的顶级并重新开始,surgery a将会运行。

我的问题是:
1.究竟是什么错误?
2.何时以及如何发生?
3.为什么从新的顶层重新运行它会使它工作?
4.我该如何处理?

1 个答案:

答案 0 :(得分:7)

这是类型错误,而不是运行时错误。它不会“花费”任何东西,也不会与你在内存中的结构大小有任何关系。

如果您在顶层中不小心,并且使用同名混合两种不同类型,则会发生这种情况。比较:

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

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

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

如何修复它:如果重新定义具有与前一个定义不同的新定义的类型,则必须小心重新定义先前在顶层中记录的此先前类型的操作。实际上,它们仍然被打字为期望旧类型,并且使用新类型将导致此类错误。