Блок `do` внутри выражений вычислений получил ошибку? - PullRequest
0 голосов
/ 07 июня 2018

Следующий код может быть скомпилирован.

async {
    //do (
    use outStream = File.Create(downloading)
    do! httpRequestStreamCopyTo url outStream
    //)
    if File.Exists(fullname) then
        File.Delete(fullname)
    File.Move(downloading, fullname)
}

И мне нужно будет закрыть outStream перед переименованием.Таким образом, он был изменен на

async {
    do (
        use outStream = File.Create(downloading)
        do! httpRequestStreamCopyTo url outStream // Error
    )
    if File.Exists(fullname) then
        File.Delete(fullname)
    File.Move(downloading, fullname)
}

И он получил следующую ошибку на do! httpRequestStreamCopyTo (reportingUri url) outStream?

Ошибка FS0750 Эта конструкция может использоваться только в выражениях вычислений

1 Ответ

0 голосов
/ 07 июня 2018

Можно ожидать такого встроенного тела async, чтобы outStream было правильно определено:

async {
    do! async {
        use outStream = File.Create(downloading)
        do! httpRequestStreamCopyTo url outStream
    }
    if File.Exists(fullname) then
        File.Delete(fullname)
    File.Move(downloading, fullname)
}

Поскольку это встроенное тело блокируется, это концептуально эквивалентно последовательным async вызовам:

async {
    use outStream = File.Create(downloading)
    do! httpRequestStreamCopyTo url outStream
}
async {
    if File.Exists(fullname) then
        File.Delete(fullname)
    File.Move(downloading, fullname)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...