我在F#中创建了一个函数来从Yahoo恢复历史数据(F#的经典异步示例):
let getCSV ticker dStart dEnd =
async {
let query = getFileUrl ticker dStart dEnd
let req = WebRequest.Create(query)
use! resp = req.AsyncGetResponse()
use stream= resp.GetResponseStream()
use reader = new StreamReader(stream)
let content = reader.ReadToEnd()
let ts = parseData content
return ts
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以通过执行以下操作异步运行此函数:
let test=
["MSFT";"YHOO"]
|>List.map (fun x -> getCSV x (DateTime.Parse("01.01.2000")) (DateTime.Parse("01.01.2010")))
|> Async.Parallel
|> Async.RunSynchronously
Run Code Online (Sandbox Code Playgroud)
好,这很酷.
现在,我想知道的是如何应用一些功能,这是价格的历史:
例如:
let getReturns (prices:(DateTime *float)list) =
[for i in 1..(prices.Length-1) -> i]
|> List.map (fun i ->(fst (List.nth …Run Code Online (Sandbox Code Playgroud) 考虑一系列F#序列:
let seqOf123 = seq { for i in 1..3 do yield i }
let seqOf456 = seq { for i in 4..6 do yield i }
let seqOf789 = seq { for i in 7..9 do yield i }
Run Code Online (Sandbox Code Playgroud)
......以及包含所有这些内容的序列:
let seqOfSeqOfNums =
seq {
yield seqOf123
yield seqOf456
yield seqOf789
}
Run Code Online (Sandbox Code Playgroud)
现在我们有一系列序列,我们可以使用内置的Seq.concat函数展平,并在async子句中包装以异步执行:
let firstAsyncSeqOfNums = async { return Seq.concat seqOfSeqOfNums }
Run Code Online (Sandbox Code Playgroud)
我们得到了一个由9个数字组成的异步序列,并带有一个签名Async<seq<int>>,我们将回过头来.
现在考虑一系列异步序列:
let asyncSeqOf123 = async { return seqOf123 }
let asyncSeqOf456 = async { …Run Code Online (Sandbox Code Playgroud)