gpt4 book ai didi

functional-programming - 惰性求值在这个例子中是如何工作的?

转载 作者:行者123 更新时间:2023-12-05 08:45:27 28 4
gpt4 key购买 nike

如果我有这个功能:让 x = print_endline "foo"in x,x;;它有这个签名:unit * unit = ((), ()) 并评估为 foo

我不明白为什么它会打印一次 foo。

另一方面:let x() = print_endline "foo"in x(),x();; 将打印 foo 两次并具有签名:unit * unit = ((), ())

谁能解释一下这背后的原理以及它在这个具体例子中是如何工作的?

最佳答案

OCaml 是一种热切的语言,除非另有说明。为了创建惰性值,我们使用 lazy关键字,例如 lazy (print_endline "foo")将创建一个 unit Lazy.t 类型的惰性值这将打印 foo , 一旦它被 Lazy.force 强制.

OCaml 中的所有其他值都是急切的并且会立即求值。您对 let .. in ... 感到困惑句法形式。

句法形式

let <var> = <expr1> in <expr2>

首先评估<expr1>然后评估 <expr2>值为 <expr1>绑定(bind)到 <var> .最后,<expr2>的结果成为整个表格的值(value)。

所以当你说,let x = 2 in x + x你先评价2并将其绑定(bind)到 x然后评估 x + xx=2 ,即 4 , 所以表达式的值 let x = 2 in x + x4 .这是一个纯表达式,它没有定义任何函数,也没有绑定(bind) x在全局范围内。

回到你的例子,

let x = print_endline "foo" in x, x

我们首先评估<expr1> ,即 print_endline "foo"有打印的副作用foo并返回值 ()类型 unit .接下来,()绑定(bind)到 x<expr2>被评估,这 x,x , 等于 (),() .

你的第二个例子,

let x () = print_endline "foo" in x (), x ()

绑定(bind) x到函数 fun () -> print_endline "foo"自从

let f x = <expr>

的语法糖
let f = fun x -> <expr>

即函数的定义。

因此,您的表达式首先求值 <expr1> ,现在是 fun () -> print_endline "foo"并将其绑定(bind)到 x .现在你评估x (), x ()并调用 x ()两次,两次调用都返回 () .

最后,你在问题中说,

If I have this function: let x = print_endline "foo" in x,x;;

你那里没有任何功能。很像 let x = 2 in x + x ,您没有定义任何函数,而只是评估 x+xx绑定(bind)到 2 .评估后,没有剩菜,x不受任何约束。在类 C 语法中,它与

{
int x = 2;
x + x;
}

所以如果你想定义一个函数,你必须使用语法

let <name> <params> = 
<expr>

在哪里<expr>是函数的主体,在上下文中计算,其中每个参数都用其实际值(参数)代替。

例如,

let print_foo () = 
print_endline "foo"

或者,

let sum_twice x y = 
let z = x + y in
2 * z

我建议阅读 OCaml Tutorial更好地了解 OCaml 语法。

关于functional-programming - 惰性求值在这个例子中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72797927/

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