我需要一个defaultArg带有Lazy第二个参数的函数实现.这是一个用法示例:
defaultArgLazy option (lazy doSomeHeavyWorkThatShouldBeAvoided())
Run Code Online (Sandbox Code Playgroud)
它很容易实现
let defaultArgLazy o (p:'a Lazy) =
match o with
| Some v -> v
| None -> p.Force()
Run Code Online (Sandbox Code Playgroud)
但我想知道是否存在我缺少的标准实现.
我不知道内置的任何内容,但这是您的函数的更通用版本:
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
Run Code Online (Sandbox Code Playgroud)
它需要任何函数(unit -> 'a)而不是特定的 a Lazy<'a>',因此您只需传递 Lazy 的Force方法即可,并保留求值仅发生一次的保证。
也许Lazy.Force()是在 F# 中添加到现有的 .NET 之上Lazy.Value,以便您可以更惯用地使用高阶函数。
请注意,与内置参数相比,我交换了参数顺序,defaultArg以便与其他模块中的功能更加一致,并且更方便管道/柯里化。