gpt4 book ai didi

ocaml - OCaml 的 Lazy.lazy_from_val 的目的是什么?

转载 作者:行者123 更新时间:2023-12-04 17:38:43 24 4
gpt4 key购买 nike

Lazy.lazy_from_val的文档声明此功能适用于特殊情况:

val lazy_from_val : 'a -> 'a t
lazy_from_val v returns an already-forced suspension of v This is for special purposes only and should not be confused with lazy (v).

他们在谈论哪些案例?

如果我从以下值创建一对暂停计算:
let l1 = lazy 123
let l2 = Lazy.lazy_from_val 123

这两者有什么区别?因为 Lazy.lazy_is_val l1Lazy.lazy_is_val l2两者都返回 真实 说值已经被强制了!

最佳答案

特殊目的是如果您需要一个惰性值,但有时您已经计算出(非惰性)值。您可以使用 lazy_from_val将已计算的值转换为值的(强制)惰性版本。

let f lazyint =
Lazy.force lazyint + 42

let li = lazy 4;;

# f li;;
- : int = 46
# f 14;;
^^
Error: This expression has type int but an expression was expected of type
int Lazy.t = int lazy_t
# f (Lazy.lazy_from_val 14);;
- : int = 56

在这个(人为的)示例中,您可能希望调用 f具有普通整数值(在本例中为 14)。可以,但是需要使用 Lazy.lazy_from_val让它工作。

关键区别在于 lazy采用 'a 类型的表达式并创建 'a lazy_t 类型的暂停计算(本质上是闭包) . Lazy.lazy_from_val采用 'a 类型的预计算值并将其转换为 'a lazy_t 类型的(预强制)值.如果表达式有副作用,则可以看出两者之间的差异。
# let p () = print_string "here\n"; 3 ;;
val p : unit -> int = <fun>
# let l1 = lazy (p ());;
val l1 : int lazy_t = <lazy>
# let l2 = Lazy.lazy_from_val (p ());;
here
val l2 : int Lazy.t = lazy 3
# f l1;;
here
- : int = 45
# f l2;;
- : int = 45
#

您可以使用显式闭包和引用直接实现惰性操作。正如 Matthias Benkard 所指出的,OCaml 的惰性机制使用特殊的语法来减少使用起来的麻烦。即 lazy是 OCaml 关键字,而不是函数。

关于ocaml - OCaml 的 Lazy.lazy_from_val 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9760580/

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