当我遇到我不理解的错误消息时,我正在OCaml中编写具有用户定义类型的函数。
我目前正在使用OCaml交互式顶级控件,还使用Visual Studio Code编写我的代码。奇怪的是,当我在Visual Studio Code中运行代码时,它可以很好地编译,但是在交互式顶层中遇到错误。
我要引用的OCaml代码如下:
type loc = int;;
type id = string;;
type value =
| Num of int
| Bool of bool
| Unit
| Record of (id -> loc)
;;
type memory = (loc * value) list;;
exception NotInMemory;;
let rec memory_lookup : (memory * loc) -> value
= fun (mem, l) ->
match mem with
| [] -> raise NotInMemory
| hd :: tl -> (match hd with
| (x, a) -> if x = l then a else (memory_lookup (tl, l))
)
;;
我编写的代码基本上是我实现/模拟查找内存并返回相应值的基本尝试。
这是一个示例输入:
memory1 = [ (1, Num 1) ; (2, Bool true) ; (3, Unit) ];;
这是预期的输出:
memory_lookup (memory1, 2);;
- : value = Bool true
但是,这是实际输出:
Characters: 179-180:
| (x, a) -> if x = l then "a" else (memory_lookup (tl, l)))
Error: This expression has type value/1076
but an expression was expected of type value/1104
(为澄清起见:错误与字符a
有关)
有人知道type value/1076
和type value/1104
是什么意思吗?另外,如果我编写的代码有任何问题,有人会指出吗?
谢谢。
答案 0 :(得分:1)
当多次定义一个类型,并且旧类型的某些值保留在作用域中时,这种错误会在顶级发生。一个简单的例子是
type t = A
let x = A;;
type t = A
let y = A;;
x = y;;
错误:此表达式的类型为t / 1012,但是期望该类型的表达式 t / 1009
value/1076
中类型名称后面的数字部分是类型value
的绑定时间。将此绑定时间用作在两种具有相同名称的不同类型之间进行区分的最后手段。因此
错误:此表达式的类型值为/ 1076 但是期望表达式的类型为value / 1104
表示值memory1
是在时间value
定义的类型1076
定义的,而函数memory_lookup
的定义是类型value
的期望值在以后的日期(也称为时间1104
)。绑定时间有点随意,因此在OCaml 4.08中可以简单地用value/1
和value/2
代替它们。