为什么我返回Async <unit>而不是Async <result>?

时间:2019-02-06 13:28:59

标签: f#

问题:

我正在努力弄清楚如何为返回异步结果类型的函数建模。

示例:

type Get<'requestor,'item,'error> = 'requestor -> Async<Result<'item list,'error>>

注意:

直到我不得不编写依赖于F#函数类型的C#代码时,我才遇到这个问题。因此,我的C#代码正在执行IO,因此想使用Task类型。

尝试失败:

我想编写惯用的F#代码,并且不想在我的F#签名中撒满C#任务类型。

例如,我不想这样做:

type Get<'requestor,'item,'error> = 'requestor -> Task<Result<'item list,'error>>

我的挑战是我还没有想办法返回:

Async<Result<'item list,'error>>

这是我失败的一个例子:

let someLongRunningOperation = async { Ok [1] } // Returns Async<unit> instead of AsyncResult

结论:

最后,我如何返回引用以下失败示例的异步结果类型:

let someLongRunningOperation = async { Ok [1] }

1 个答案:

答案 0 :(得分:7)

在计算表达式中,您需要使用return关键字将值包装为该CE的类型。所以这个:

let someLongRunningOperation = async { Ok [1] }

应更正为此:

let someLongRunningOperation = async { return Ok [1] }

然后您将返回一个Async<Result>