gpt4 book ai didi

.net - Lazy<_> 和 thunk 之间的实际区别 (fun () -> ...)

转载 作者:行者123 更新时间:2023-12-04 07:15:37 25 4
gpt4 key购买 nike

在 F# 核心库中,有接受 thunk ( fun () -> ... ) 的高阶函数,但在概念上也可以接受 Lazy<_> ,如 Option.defaultWith . F# 对 Lazy<_> 有很好的语法支持通过lazy关键字,但我想不出 F# 核心库中有任何函数需要 Lazy<_>而不是一个重击。我猜这是因为使用 thunk 比使用特定于 .NET 的 Lazy<_> 更“FP”。类型。

但是除了模糊“少FP”:如果最多需要1次该值,使用Lazy<_>的实际考虑是什么?而不是重击?例如,是否存在性能差异(CPU 和/或分配/内存)?其他顾虑?什么样的情况用Lazy<_>解决比较好而不是重击?

最佳答案

作为包装 thunk 的单独对象,提供同步并保存结果引用,Lazy<_>与简单的 thunk 相比,有一些额外的开销。

如果您知道您只会(最多)评估一次 thunk,我认为如果可以的话,您没有理由不使用函数。您可以调用 Lazy<_>Value在另一个函数中,但在这种情况下,我知道它没有任何好处。

一种情况我记得Lazy<_>当我们在产品中有两个单独的功能标志时很有用,如果启用,这两个功能标志都可能需要初始化 Orleankka Actor 系统 - 每次应用程序启动时应该只执行一次昂贵的操作。

所以我们的选择要么是很多嵌套的if s,可变选项,或者这个:

let actorSystem = lazy initializeActorSystem ()

if feature1Enabled then
let as = actorSystem.Value
...

if feature2Enabled then
let as = actorSystem.Value
...

与 thunk 不同, Lazy<_>还允许您检查是否对 thunk 进行了评估。同样的例子:
if actorSystem.IsValueCreated then
actorSystem.Value.Dispose()

其他情况通常是当您不确定是否最多评估一次 thunk 时,特别是如果它可以同时发生。我认为我们也有类似的用例,用于在本地未提供给同时启动的多个组件时读取一些外部配置 - Lazy<_>确保我们只进行一次远程调用(如果需要的话),无论哪个组件首先发现它需要它。

关于.net - Lazy<_> 和 thunk 之间的实际区别 (fun () -> ...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53742803/

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