是否有标准的F#defaultArg实现接受懒惰?

Mik*_*kov 5 f#

我需要一个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)

但我想知道是否存在我缺少的标准实现.

The*_*Fox 1

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

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以便与其他模块中的功能更加一致,并且更方便管道/柯里化。