Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#期权相当于C#和#x27;s操作人员_F#_Option - Fatal编程技术网

F#期权相当于C#和#x27;s操作人员

F#期权相当于C#和#x27;s操作人员,f#,option,F#,Option,我正在寻找一种方法来获取F#选项的值,如果没有,则使用默认值。 这似乎太普遍了,我简直不敢相信有什么东西不存在。我现在是这样做的: // val getOptionValue : Lazy<'a> -> Option<'a> -> 'a let getOptionValue (defaultValue : Lazy<_>) = function Some value -> value | None -> defaultValue

我正在寻找一种方法来获取F#选项的值,如果没有,则使用默认值。 这似乎太普遍了,我简直不敢相信有什么东西不存在。我现在是这样做的:

// val getOptionValue : Lazy<'a> -> Option<'a> -> 'a    
let getOptionValue (defaultValue : Lazy<_>) = function Some value -> value | None -> defaultValue.Force ()
选项模块中的任何函数都不能完成我认为非常基本的任务。我缺少什么?

您正在寻找(
'T option->'T->'T->'T

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

类型T(?arg)=
成员val Arg=defaultArg Arg 0
设t1=T(1)
设t2=T()//t2.Arg为0

您可以轻松创建自己的操作员来执行相同的操作

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."
这会更详细一点


编辑:尼康三号为操作员提供了更好的实施方案,因此我对其进行了更新。

谢谢!真不敢相信我错过了;)MSDN链接已断开,新链接使用的运算符似乎比“无”的情况下的“defaultArg-PossiblyOne”要好一些(尽管我避免引入新运算符以避免混淆同事:)。但是你为什么不把它简单地定义为
let(|?)=defaultArg
?嗯,你说得很好。我更新了对您想法的回答。如果您确实使用这样的自定义运算符,您如何在代码库中共享它们(假设您在不同的名称空间、模块、某些类型等中具有功能)?显然,如果您必须将它们放在一个模块中,并将模块名称指定为前缀,这会降低简单性。@piers7关于共享,您是对的,您必须确保每个人都可以轻松使用这些通用运算符。我会将它们放在一个名为
Project\u imports
的模块中,并将其标记为
[了解更多信息。
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."