Создание Future используя Future CE
Future имеет свой CE, который используется также как async или task CE встроенные в F#. Более подробно о CE вы можете прочитать на сайте.
Например, мы можем заменить базовые функции создания на future CE:
let ready = future { return "Hello, world!" } // ~ Future.ready "Hello, world!"
let lazy' = future { return (foo ()) } // ~ Future.lazy' (fun () -> foo ())
Наиболее важным свойством CE является упрощение работы с bind. Пример чтения-записи можно переписать используя CE так:
// readFileAsync: filePath: string -> Future<string>
// writeFileAsync: filePath: string -> content: string -> Future<unit>
let readAndWriteFuture = futur {
let! content = readFileAsync "my-file.txt"
return! writeFileAsync "other-file.txt" content
}
Видимым преимуществом CE является возможность "уплощить" цепочка bind, зависимых между собой. Пример множественно зависимых bind можно переписать так:
let doManyWorkWithCrossResults = future {
let! val1 = doWork1 ()
let! val2 = doWork2 val1
let! val3 = doWork3 val1 val2
...
let! valN = doWorkN val1 val2 ... valPrevN
}
Также CE добавляют синтаксис и для Future.merge или Future.catch комбинаторов.
let parallelCE = future {
let! val1 = doWork1 ()
and! val2 = doWork2 ()
and! val3 = doWork3 ()
}
let catchCE = future {
try
do! doWork ()
with ex ->
printfn $"{ex}"
}
let tryFinally = future {
try
do! doWork ()
finally
do finallize ()
}