Реализовать делать пока в F #? - PullRequest
0 голосов
/ 30 августа 2018

Я попробовал следующий код для реализации do в F #.

let listObjects bucketName = asyncSeq {
    use client = new AmazonS3Client(RegionEndpoint.USEast2)
    let request = new ListObjectsV2Request(BucketName = bucketName, MaxKeys = 10)

    while (
        let! response = client.ListObjectsV2Async(request) |> Async.AwaitTask
        for entry in response.S3Objects do
            yield entry.Key
        response.IsTruncated) 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

1 Ответ

0 голосов
/ 30 августа 2018

Обычно вы можете использовать хвостовую рекурсию в F # для решения тех же проблем, которые вы решали бы с помощью циклов в C #. Я не совсем понимаю, каково ваше предполагаемое поведение цикла while, но вот пример хвостовой рекурсивной выдачи S3Objects до тех пор, пока response.IsTruncated не станет ложным:

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()            
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...