gpt4 book ai didi

ocaml - 理解 Ocaml 中的命令式列表示例

转载 作者:行者123 更新时间:2023-12-01 01:31:32 25 4
gpt4 key购买 nike

我是 ocaml 的新手。
如果有人能帮助我理解,不胜感激
本书第 94 页上的 Material
“用客观的caml开发应用程序”。

难以理解以下段落的含义:

Just that the evaluation of (itl l) has taken place before the evaluation of (ihd l), so that on the last iteration of imap, the list referenced by l became the empty list before we examined its head. The list example is henceforth definitely empty even though we have not obtained any result


imap (function x ! x)示例返回
Uncaught exception: Failure("hd")

代替
- : string ilist = {c=["one"; "two"; "three"]}

我会认为
else icons (f (ihd l)) (imap f (itl l))`

会变成 icons("one") ( ( icons("two") ( ( icon("three")([]) ) ) )并返回
- : string ilist = {c=["one"; "two"; "three"]}

最佳答案

我在书中的例子中,列表是以命令式的方式实现的。函数itl改变列表 - 即它通过删除第一个元素来更改列表。调用后itl ,第一个元素基本上永远消失了。

棘手的部分是 icons 的参数的顺序在语句中执行:

else icons (f (ihd l)) (imap f (itl l))

在 OCaml 规范中,没有指定顺序。上次检查INRIA编译器先把最后一个参数排序,所以 (imap f (itl l))(f (ihd l)) 之前执行.这意味着到时候 ihd实际上被称为, itl已被调用足够多的次数来删除 l 的所有元素.

举个例子,让我们看看倒数第二个递归调用 - l只是 ["three"] .你认为这会导致:
icons (f "three") (imap f [])

但是让我们看看如果我们调用 itl 会发生什么第一的:
(* l = ["three"] *)
let tail = (itl l) in (* tail = [], l = [] *)
let head = (ihd l) in (* l = [], ihd raises an exception *)
icons head (imap f tail)

例如,尝试运行以下代码:
let f x y z = x + y + z
f (print_int 1; 1) (print_int 2; 2) (print_int 3; 3)

在我的机器(OCaml 3.12)上,我得到了这个输出:
321- : int = 6

关于ocaml - 理解 Ocaml 中的命令式列表示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4506353/

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