结果的最终输出,单位为F#

结果的最终输出,单位为F#,f#,F#,这似乎是一个答案极其简单的问题,但我想不起来: 在结果中是否有一个内置方法用于: let (a: Result<'a, 'a>) = ... match a with | Ok x -> x | Error e -> e let(a:Result)=。。。 匹配 |确定x->x |错误e->e 否,因为此函数要求确定类型和错误类型相同,这使得结果不那么一般。否,没有任何函数允许您这样做。但你可以很容易地定义它: [] 模块结果= 让连接(值:结果)= 匹配值 |O

这似乎是一个答案极其简单的问题,但我想不起来:

在结果中是否有一个内置方法用于:

let (a: Result<'a, 'a>) = ...
match a with
| Ok x    -> x
| Error e -> e
let(a:Result)=。。。
匹配
|确定x->x
|错误e->e

否,因为此函数要求
确定
类型和
错误
类型相同,这使得
结果
不那么一般。

否,没有任何函数允许您这样做。但你可以很容易地定义它:

[]
模块结果=
让连接(值:结果)=
匹配值
|Ok v->v
|错误e->e
让我们来看看结果=
如果System.String.IsNullOrEmpty s,则
错误s
其他的
好的
让我们=
getResult“asd”
|>Result.join
|>打印fn“%s”
它不会使
Result
不那么通用(正如@brianberns所说),因为它不是实例成员。的存在不会使
任务
变得不那么一般

更新 在对FSharpPlus和FSharpx.Extras进行了更仔细的搜索之后,我找到了必要的函数。它是签名
('a->'c)->('b->'c)->Result->c
,而不是
Result->'a
,在两个库(和)中都称为
Result。因此,为了获得值,我们可以将
id
作为两个参数传递:

#r“nuget:FSharpPlus”
开放式FSharpPlus
//或
#r“nuget:FSharpx.Extras”
开放式FSX
getResult“asd”
|>Result.id或id
|>打印fn“%s”

另外,定义快捷方式并将其命名为
Result.join
Result.from也可能有用,因为Haskell中的
不是我所知道的,但这似乎不是经常有用的。您是否有这样一个示例,说明这何时会有所帮助?是的,例如,对于Suave Web服务器:无论是成功响应还是错误,所有对象都是同一个对象。因此,我可以用一个计算表达式定义一系列相互关联的事件,最后,我收集一个作为结果的对象,或者显示错误的同一个对象。但是将result作为中间类型允许我使用表达式而不是一堆嵌套的if。对不起,我不是想暗示它对
结果有某种全局影响。我的意思是,它不是标准的
Result
模块的一部分,因为它只在类型相同的情况下工作。这与我在问题中发布的相同,我只是想知道是否有一个实用程序函数已经为这样的模块构建case@Thomas,我在第三方库中找到了此函数,请检查更新的答案