在F#中执行do?

在F#中执行do?,f#,F#,在F#中,我尝试了以下代码来实现do 但是,它不能编译吗?以下代码是唯一的选项吗 let listObjects bucketName = asyncSeq { use client = new AmazonS3Client(RegionEndpoint.USEast2) let request = new ListObjectsV2Request(BucketName = bucketName, MaxKeys = 10) let! response = client.

在F#中,我尝试了以下代码来实现do

但是,它不能编译吗?以下代码是唯一的选项吗

let listObjects bucketName = asyncSeq {
    use client = new AmazonS3Client(RegionEndpoint.USEast2)
    let request = new ListObjectsV2Request(BucketName = bucketName, MaxKeys = 10)
    let! response = client.ListObjectsV2Async(request) |> Async.AwaitTask
    for entry in response.S3Objects do // do while
        yield entry.Key
    while response.IsTruncated do
        let! response = client.ListObjectsV2Async(request) |> Async.AwaitTask
        for entry in response.S3Objects do
            yield entry.Key

通常可以在F#中使用尾部递归来解决与在C#中使用循环解决的问题相同的问题。我不完全清楚while循环行为是什么,但下面是一个tail递归生成
S3Objects
直到
响应的示例。IsTruncated
为false:

let listObjects bucketName = 
    asyncSeq {
        use client = new AmazonS3Client(RegionEndpoint.USEast2)
        let request = new ListObjectsV2Request(BucketName = bucketName, MaxKeys = 10)
        let! response = client.ListObjectsV2Async(request) |> Async.AwaitTask
        let rec getKeys () = 
            asyncSeq {
                for entry in response.S3Objects do
                    yield entry.Key
                if response.IsTruncated
                then yield! getKeys ()
            }   

        yield! getKeys()            
    }

通常可以在F#中使用尾部递归来解决与在C#中使用循环解决的问题相同的问题。我不完全清楚while循环行为是什么,但下面是一个tail递归生成
S3Objects
直到
响应的示例。IsTruncated
为false:

let listObjects bucketName = 
    asyncSeq {
        use client = new AmazonS3Client(RegionEndpoint.USEast2)
        let request = new ListObjectsV2Request(BucketName = bucketName, MaxKeys = 10)
        let! response = client.ListObjectsV2Async(request) |> Async.AwaitTask
        let rec getKeys () = 
            asyncSeq {
                for entry in response.S3Objects do
                    yield entry.Key
                if response.IsTruncated
                then yield! getKeys ()
            }   

        yield! getKeys()            
    }

在这个问题中给出了一些备选方案和理由;-我喜欢doWhile功能。没有do…但是,在这个问题中给出了一些替代方案和理由;-我喜欢
doWhile
功能。我已经更新了问题,行
let!response=client.ListObjectsV2Async(request)|>Async.AwaitTask
现在需要在内部
asyncSeq{…}
中移动。而且外部的
asyncSeq{…}
可以被删除。实际上我认为外部的asyncSeq仍然是包含
use
的必要部分。否则,
client
将在函数返回时以及asyncSeq实际被枚举之前被释放。我已经更新了问题,行
let!response=client.ListObjectsV2Async(request)|>Async.AwaitTask
现在需要在内部
asyncSeq{…}
中移动。而且外部的
asyncSeq{…}
可以被删除。实际上我认为外部的asyncSeq仍然是包含
use
的必要部分。否则,
client
将在函数返回时和实际枚举asyncSeq之前立即处理。