“Chaining” asynchronous functions in F#

后端 未结 2 1599
伪装坚强ぢ
伪装坚强ぢ 2020-12-19 17:15

I have created a function in F# to recover historical data from Yahoo (the classic asynchronous example for F#):

let getCSV ticker dStart dEnd =
async   {
           


        
2条回答
  •  难免孤独
    2020-12-19 17:53

    I would typically write the call to the function directly inside an asynchronous workflow. This is mostly a matter of style or preference - I think that code written using asynchronous workflows is generally more explicit and doesn't use higher-order functions as often (though they're still sometimes useful):

    let test=
        [ for stock in ["MSFT";"YHOO"] ->
            async { let! data = getCSV stock (DateTime(2000, 1, 1)) (DateTime(2010, 1, 1))
                    return getReturns data } ]
        |> Async.Parallel
        |> Async.RunSynchronously 
    

    This means that the workflows executed in parallel first get the data and then call getRteurns to extract the data. The entire operation is then parallelized.

    Alternatively, you could either use Joel's solution (modify the getReturns function so that it takes an asynchronous workflow and returns an asynchronous workflow) or define a function Async.map that takes an asynchronous workflow and constructs a new one that applies some function to the result.

    Using your original getReturns function, you can then write:

    let test=
        ["MSFT";"YHOO"]
        // For every stock name, generate an asynchronous workflow
        |> List.map (fun x -> getCSV x (DateTime(2000, 1, 1)) (DateTime(2010, 1, 1)))
        // For every workflow, transform it into a workflow that 
        // applies 'getReturns' to the result of the original workflow
        |> List.map (Async.map getReturns)
        // Run them all in parallel
        |> Async.Parallel
        |> Async.RunSynchronously
    

    The definition of Async.map is quite simple:

    module Async =
      let map f workflow = async {
        let! res = workflow
        return f res }
    

提交回复
热议问题