首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理这个错误?

如何处理这个错误?
EN

Stack Overflow用户
提问于 2013-03-19 13:06:11
回答 1查看 73关注 0票数 0

我正在处理非常长的列表和大树。

有时我会发现这个错误:

代码语言:javascript
复制
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. 我应该如何处理它?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-19 13:56:56

这是一个类型错误,而不是运行时错误。它不会“花费”任何东西,也不会以任何方式与内存中结构的大小相关。

如果您在顶层不小心,并且混合了两个具有相同名称的不同类型,就会发生这种情况。比较:

代码语言:javascript
复制
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

使用

代码语言:javascript
复制
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。类型系统试图提供帮助,并告诉您它内部分配给名称的唯一整数,以确保在整个程序中确实存在唯一的整数。

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

解决方法:如果您使用不同于前一个类型的新定义重新定义了一个类型,则必须小心地重新定义先前记录在toplevel中的前一个类型上的操作。实际上,它们的类型仍然是期望的旧类型,将它们与新类型一起使用将导致此类错误。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15491847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档