在F#中执行do?
在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.
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之前立即处理。