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

Sco*_*rod 1 f#

问题:

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

例:

type Get<'requestor,'item,'error> = 'requestor -> Async<Result<'item list,'error>>
Run Code Online (Sandbox Code Playgroud)

注意:

在我必须编写依赖于F#函数类型的C#代码之前,我没有遇到过这个问题.因此,我的C#代码正在执行IO,因此想要使用Task类型.

尝试失败:

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

例如,我不想这样做:

type Get<'requestor,'item,'error> = 'requestor -> Task<Result<'item list,'error>>
Run Code Online (Sandbox Code Playgroud)

我的挑战是我还没有找到回归的方法:

Async<Result<'item list,'error>>
Run Code Online (Sandbox Code Playgroud)

这是我失败的一个例子:

let someLongRunningOperation = async { Ok [1] } // Returns Async<unit> instead of AsyncResult
Run Code Online (Sandbox Code Playgroud)

结论:

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

let someLongRunningOperation = async { Ok [1] }
Run Code Online (Sandbox Code Playgroud)

rmu*_*unn 7

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

let someLongRunningOperation = async { Ok [1] }
Run Code Online (Sandbox Code Playgroud)

应该纠正于此:

let someLongRunningOperation = async { return Ok [1] }
Run Code Online (Sandbox Code Playgroud)

然后你会回来的Async<Result>.