F#无法解决异步中的功能

时间:2014-09-07 11:34:38

标签: asynchronous f#

我真的是F#noob,我试着编写非常简单的程序,它并行地迭代列表。这是简化代码

let test = ["xx"; "yy"; "zz"]
let urls = 
    ["http://google.com";"http://google.com"]

let p l = async {
    let t = test
    for k in t do
        printf "%s" k
} 

let find = 
    urls
    |> List.map p
    |> Async.Parallel 
    |> Async.RunSynchronously
    |> ignore


[<EntryPoint>]
let main argv = 
   find  
   printfn "%A" argv
   0 // return an integer exit code

不幸的是这个程序永远不会完成。它无法解决这一问题:

    let t = test

它永远不会越过那条线。但是如果我以这种方式改变查找和主要功能:

let find = 
    urls
    |> List.map p
    |> Async.Parallel 

[<EntryPoint>]
let main argv = 
   find 
   |> Async.RunSynchronously
   |> ignore
   printfn "%A" argv
   0 // return an integer exit code

一切都按预期工作正常。有人可以解释一下我的区别吗?

此外,如果我不调用测试功能,而是将代码列表调用为“p”函数

let t = ["xx"; "yy"; "zz"]

它在第一版中工作正常。

1 个答案:

答案 0 :(得分:4)

所以问题是find不是一个函数,而是一个值。因此find实际上在main之前运行(在第一个示例中)。

将定义更改为let find()似乎对我有用。