gpt4 book ai didi

asynchronous - 异步方法中的类型不匹配

转载 作者:行者123 更新时间:2023-12-04 12:14:38 27 4
gpt4 key购买 nike

我正在编写一个异步方法,它应该异步查询一个端口,直到找到一个,或者在 5 分钟后超时;

    member this.GetPort(): Async<Port> = this._GetPort(DateTime.Now)

member this._GetPort(startTime: DateTime): Async<Port> = async {
match this._TryGetOpenPort() with
| Some(port) -> port
| None -> do
if (DateTime.Now - startTime).TotalMinutes >= 5 then
raise (Exception "Unable to open a port")
else
do! Async.Sleep(100)
let! result = this._GetPort(startTime)
result}

member this._TryGetOpenPort(): Option<Port> =
// etc.
但是,我在 _GetPort 中遇到了一些奇怪的类型不一致问题。 ;该函数说我正在返回 Async<unit> 的类型而不是 Async<Port> .

最佳答案

这有点不直观,但让你的代码工作的方法是这样的:

member private this.GetPort(startTime: DateTime) =
async {
match this.TryGetOpenPort() with
| Some port ->
return port
| None ->
if (DateTime.Now - startTime).TotalMinutes >= 5 then
raise (Exception "Unable to open a port")

do! Async.Sleep(100)
let! result = this.GetPort(startTime)
return result
}

member private this.TryGetOpenPort() = failwith "yeet" // TODO
我冒昧地清理了一些东西并将成员设为私有(private),因为这似乎是您在这里主要追求的目标,并使用更详细的内部方法来获取端口。
你的代码没有被编译的原因是因为你的内容不一致 return来自计算:
  • Some(port)的情况下你错过了 return关键字 - 需要将值提升回 Async<port>
  • 您的 if引发异常的表达式有 else分支,但你不是 return来自两者。在这种情况下,由于您显然不希望返回任何内容而只是引发异常,因此您可以省略 else并使其成为一个命令式程序流,就像在非异步代码中一样。

  • 您可能希望考虑的另一件事是抛出异常是您想要的,或者只是返回 Result<T,Err>或者一个选项是正确的选择。异常本身并不坏,但如果有一种很好的方法可以将意义赋予包装返回值的类型,那么很多 F# 编程通常会导致避免使用它们。

    关于asynchronous - 异步方法中的类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69471151/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com