23

我正在寻找一种方法来获取 F# 选项的值,或者如果它是 None 则使用默认值。这似乎很常见,我不敢相信预定义的东西不存在。这是我现在的做法:

// val getOptionValue : Lazy<'a> -> Option<'a> -> 'a    
let getOptionValue (defaultValue : Lazy<_>) = function Some value -> value | None -> defaultValue.Force ()

我(有点)在寻找相当于 C# 的 F# ?操作员:

string test = GetString() ?? "This will be used if the result of GetString() is null.";

Option 模块中没有任何功能可以完成我认为非常基本的任务。我错过了什么?

4

2 回答 2

36

您正在寻找defaultArg [MSDN] ( 'T option -> 'T -> 'T)。

它通常用于为可选参数提供默认值:

type T(?arg) =
  member val Arg = defaultArg arg 0

let t1 = T(1) 
let t2 = T() //t2.Arg is 0
于 2012-09-28T15:08:49.687 回答
15

您可以轻松创建自己的操作员来做同样的事情。

let (|?) = defaultArg

您的 C# 示例将变为

let getString() = (None:string option) 
let test = getString() |? "This will be used if the result of getString() is None.";;

val getString : unit -> string option 
val test : string = "This will be used if the result of getString() is None."

这是一篇更详细的博客文章。

编辑:尼康三世为操作员提供了更好的实现,所以我更新了它。

于 2013-08-29T05:52:24.740 回答