2011-04-17 94 views
4

我在這裏有點沮喪。我知道我已經得到了所有的位,但我不知道如何把它們混合起來......結合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 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 

回答

6

可以使用async表達結合兩種:

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

非常好,感謝你及時的答覆! – Benjol 2011-04-17 11:56:18

+0

基本上,由於Async是monad,所以你可以將它們兩個組合成另一個Async。 :) – 2011-04-18 19:14:31