gpt4 book ai didi

ocaml - 什么是数据中的

转载 作者:行者123 更新时间:2023-12-05 00:51:21 27 4
gpt4 key购买 nike

(我使用 OCaml 版本 4.02.3)

我定义了一个类型 self

# type self = Self of self;;
type self = Self of self

及其实例 s
# let rec s = Self s;;
val s : self = Self <cycle>

OCaml is a strict language ,我期望定义 s会陷入无限递归。但是翻译说 s有一个值,它是 Self <cycle> .

我还对 s 应用了一个函数.
# let f (s: self) = 1;;
val f : self -> int = <fun>
# f s;;
- : int = 1

好像 s在函数应用程序之前不求值(就像在非严格语言中一样)。

OCaml 如何处理循环数据,如 s ? Self <cycle>是正常形式吗?

最佳答案

OCaml 确实是一种急切的语言,但是 s是一个完全有效且经过充分评估的术语,恰好包含一个循环。例如,这段代码产生了预期的结果:

let f (Self Self x) = x
f s == s;;

更准确地说,带有 n 个参数的构造函数的内存表示被装箱并读取如下:
⋅—————————————————————————————————————————————⋅
| header | field[0] | field[1] | ⋯ | fiekd[n] |
⋅—————————————————————————————————————————————⋅

标题包含元数据,而 field[k]是一个 OCaml 值,即整数或指针。在 s的情况下, Self只有一个参数,因此只有一个字段 field[0] . field[0]的值那么它只是一个指向块开头的指针。术语 s因此在 OCaml 中可以完美地表示。

此外,顶级打印机能够检测到这种循环并打印 <cycle>避免在打印 s 的值时陷入无限递归.在这里, <cycle> , 喜欢 <abstr><fun> , 仅代表一种顶级打印机无法打印的值。

但是请注意,循环值在许多情况下会触发无限递归,例如 f s = s哪里 (=)是结构平等
而不是物理的 (i.e. (==))触发这种递归,另一个例子是
let rec ones = 1 :: ones;; (* prints [1;<cycle>] *)
let twos = List.map ((+) 1) ones;; (* falls in an infinite recursion *)

关于ocaml - 什么是数据中的<cycle>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44367761/

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