我该如何用F#编写以下代码?
var reader = await someDatabaseCommand.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
var foo = reader.GetDouble(1);
// ...
}
我对F#非常陌生,这是我能想到的最好的翻译。
task {
let! reader = someDatabaseCommand.ExecuteReaderAsync ()
let! tmp1 = reader.ReadAsync ()
let mutable hasNext = tmp1
while hasNext do
// ...
let! tmp2 = reader.ReadAsync ()
hasNext <- tmp2
}
我知道这是一个C#库,所以它不会完美,但我想避免需要将ReadAsync
的结果存储在变量中,更不用说有两个临时变量了。我不知道如何在不绑定名称的情况下获取Task
的“结果”。也许递归解决方案会起作用?
async
可能是有意义的,这样就不会有这个问题了。 - Tomas PetricekSeqT
https://fsprojects.github.io/FSharpPlus//type-seqt.html,这样就不必在Async
和Seq
之间来回转换了。然后只需在上面的代码中将Async.AwaitTask
替换为SeqT.lift
,将asyncSeq
替换为monad.plus
即可。 - GusAsync.AwaitTask
将任务转换为异步,那么它就变成尾递归了吗? - Adam