我在这里有点沮丧.我知道我已经掌握了所有的东西,但我无法弄清楚如何将它们结合起来......
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
Run Code Online (Sandbox Code Playgroud) 我试图找出以下F#表达式的有效语法.假设我有一个F#异步计算:
let asyncComp n = async { return n }
Run Code Online (Sandbox Code Playgroud)
它有一个签名'a -> Async<'a>.现在我定义一系列的顺序:
let seqOfAsyncComps =
seq {
yield asyncComp 1
yield asyncComp 2
yield asyncComp 3
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个项目seq<Async<int>>.如果我想从元素异步映射seq<Async<int>>到seq<Async<int>>.这不起作用:
let seqOfAsyncSquares =
seqOfAsyncComps |> Seq.map (fun x -> x * x) // ERROR!!!
Run Code Online (Sandbox Code Playgroud)
当然,x是的Async<int>,我必须提取int第一个,所以我可以做以下事情:
let seqOfAsyncSquares =
seqOfAsyncComps |> Seq.map (fun x -> async {
let! y = x
return y * y }) // OK …Run Code Online (Sandbox Code Playgroud) 假设我有一个异步数据源:
let getData() = async { return [ 3.14; 2.72 ] }
Run Code Online (Sandbox Code Playgroud)
我可以使用let!和临时标签来调用它:
let showData1() = async {
let! data = getData()
data
|> Seq.iter (printfn "%A")
}
Run Code Online (Sandbox Code Playgroud)
或者,我可以称之为(效率低下!)使用Async.RunSynchronously和管道,没有临时标签:
let showData2() = async {
getData()
|> Async.RunSynchronously
|> Seq.iter (printfn "%A")
}
Run Code Online (Sandbox Code Playgroud)
我喜欢语法,showData2但知道调用Async.RunSynchronously绑定了调用线程.
是否在某处定义了语法,运算符或函数,允许我将其Async<'T>输入到接受的函数中'T?