Asynchronous 组合F#异步函数

Asynchronous 组合F#异步函数,asynchronous,f#,Asynchronous,F#,我在这里有点沮丧。我知道我有所有的比特,但我不知道如何组合它们 let saveImageToDisk path content = async { use s = new FileStream(path, FileMode.OpenOrCreate) do! s.AsyncWrite(content) printfn "Done writing %A" path } // returns Async<unit>

我在这里有点沮丧。我知道我有所有的比特,但我不知道如何组合它们

let saveImageToDisk path content =
    async {
        use s = new FileStream(path, FileMode.OpenOrCreate)
        do! s.AsyncWrite(content)
        printfn "Done writing %A" path
        } // returns Async<unit>

let getImages imageUrls =
    imageUrls
        |> Seq.map (fun url -> topath url, getImage url)
        //Next line not happy because content is Async<byte[]> instead of byte[]
        |> Seq.map (fun (path, content) -> saveImageToDisk path content)
        |> Async.Parallel
        |> Async.RunSynchronously
让saveImageToDisk路径内容=
异步的{
使用s=newfilestream(路径,FileMode.OpenOrCreate)
do!s.AsyncWrite(内容)
printfn“完成写入%A”路径
}//返回异步
让GetImagesImageURL=
图像URL
|>Seq.map(趣味url->topath url,getImage url)
//下一行不满意,因为内容是异步的,而不是字节[]
|>Seq.map(乐趣(路径、内容)->saveImageToDisk路径内容)
|>异步并行
|>异步运行

您可以使用
async
表达式将两者结合起来:

let getImages imageUrls =
    imageUrls
        |> Seq.map (fun url -> async {
              let! content = getImage url
              return! saveImageToDisk (topath url) content })
        |> Async.Parallel
        |> Async.RunSynchronously

基本上,由于Async是一个单子,您可以在另一个Async中组合这两个单子: