gpt4 book ai didi

error-handling - OCaml 用户定义类型和函数返回错误

转载 作者:行者123 更新时间:2023-12-03 08:22:13 25 4
gpt4 key购买 nike

当我遇到我不理解的错误消息时,我正在 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/1076type value/1104意思是?另外,如果我写的代码有什么问题,有人能指出来吗?

谢谢你。

最佳答案

当一个类型被多次定义并且旧类型的一些值留在范围内时,这种错误发生在顶层。一个简单的例子是

type t = A
let x = A;;
type t = A
let y = A;;
x = y;;

Error: This expression has type t/1012 but an expression was expected of type t/1009


value/1076 中类型名称后的数字部分是 value 类型的绑定(bind)时间.此绑定(bind)时间用作区分碰巧具有相同名称的两种不同类型的最后手段。因此

Error: This expression has type value/1076 but an expression was expected of type value/1104



表示值 memory1使用类型 value 定义在时间 1076 定义, 而函数 memory_lookup value 类型的期望值在以后定义(又名时间 1104 )。绑定(bind)时间有点随意,所以可以简单地替换为 value/1value/2在 OCaml 4.08 中。

关于error-handling - OCaml 用户定义类型和函数返回错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53206005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com