相关疑难解决方法(0)

结合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
Run Code Online (Sandbox Code Playgroud)

f# asynchronous

5
推荐指数
1
解决办法
572
查看次数

优化F#中映射的异步序列的语法

我试图找出以下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)

f# asynchronous sequence

5
推荐指数
1
解决办法
250
查看次数

在调用F#异步工作流时,我可以避免定义临时标签吗?

假设我有一个异步数据源:

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

f# async-workflow

2
推荐指数
1
解决办法
147
查看次数

标签 统计

f# ×3

asynchronous ×2

async-workflow ×1

sequence ×1