F#选项相当于C#的?操作者

时间:2012-09-28 15:03:32

标签: f# option

我正在寻找获取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模块中的任何功能都没有我认为是一项非常基本的任务。我错过了什么?

2 个答案:

答案 0 :(得分:35)

您正在寻找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

答案 1 :(得分:14)

您可以轻松创建自己的运算符来执行相同的操作。

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."

Here's a blog post更详细一点。

编辑:Nikon the Third为操作员提供了更好的实现,因此我对其进行了更新。