gpt4 book ai didi

f# - 使用异步的 C# 代码的 F# 等效项是什么?

转载 作者:行者123 更新时间:2023-12-02 11:53:15 25 4
gpt4 key购买 nike

我正在努力编写一个 F# 代码,该代码将依次等待一些异步方法调用。我熟悉 F# 异步工作流程,但不知道如何将其映射到一个简单的案例。

让我们以异步 XmlReader 为例。 C# 代码可能如下所示:

using (XmlReader r = XmlReader.Create(new StringReader(input), new XmlReaderSettings() { Async = true }))
{
while (await r.ReadAsync())
{
switch (r.NodeType)
{
case XmlNodeType.Element:
Console.WriteLine(r.LocalName);
break;

case XmlNodeType.Text:
Console.WriteLine(await r.GetValueAsync());
break;
}
}
}

如果这段代码没有使用异步调用,我们可以使用递归和模式匹配在 F# 中重写它。但它使用了ReadAsync和GetValueAsync,它们如何在F#对应中表示?

最佳答案

这完全未经测试,但我认为已经明白了这一点。其本质是,您需要使用 Async.AwaitTaskTask 转换为 Async,然后其余部分就非常明显了。

let doRecursiveAsyncThing input = async {
use r = XmlReader.Create(new StringReader(input), new XmlReaderSettings(Async = true ))
let loop x = async {
let! noteType = r.ReadAsync() |> Async.AwaitTask
match noteType with
| XmlNodeType.Element -> Console.WriteLine r.LocalName
do! loop x
| XmlNodeType.Text -> let! value = r.GetValueAsync() |> Async.AwaitTask
Console.WriteLine value
do! loop x
| _ -> () }

}
do! loop r

关于f# - 使用异步的 C# 代码的 F# 等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28369567/

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