gpt4 book ai didi

f# - 是否有 F# defaultArg 接受惰性的标准实现?

转载 作者:行者123 更新时间:2023-12-04 21:10:00 25 4
gpt4 key购买 nike

我需要 defaultArg 的实现功能与 Lazy作为第二个参数。这是一个使用示例:

defaultArgLazy option (lazy doSomeHeavyWorkThatShouldBeAvoided())

这很容易实现
let defaultArgLazy o (p:'a Lazy) = 
match o with
| Some v -> v
| None -> p.Force()

但我想知道是否有我缺少的标准实现。

最佳答案

我不知道内置的任何内容,但这是您的函数的更通用版本:

module Option =
let lazyDefault f opt =
match opt with
| Some x -> x
| None -> f()

let lazyVal = lazy 1
let opt = None

opt |> Option.lazyDefault lazyVal.Force // returns 1

它采用 (unit -> 'a) 的任意函数而不是专门的 Lazy<'a>' ,所以你只需通过 Lazy 的 Force方法,并保留评估只发生一次的保证。

也许 Lazy.Force()在 .NET 的现有 Lazy.Value 之上添加到 F# 中这样您就可以更惯用地使用高阶函数。

请注意,与内置 defaultArg 相比,我已经交换了参数顺序。与其他模块中的功能更一致,更方便管道/柯里化(Currying)。

关于f# - 是否有 F# defaultArg 接受惰性的标准实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36954101/

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