我有以下代码。并且不会执行Seq.map
和ignore
之间的代码。两个printfn
未执行。为什么?
我尝试调试它并在
上设置断点links
(它突出显示整个管道),printfn "Downloading"
printfn "Downloaded"
中的download
。执行将在第一个中断,但断点2,3将永远不会被击中。 (或进入)。 F#是否优化了Seq.map
部分,因为忽略了结果?
let download url =
printfn "Downloaded"
() // Will complete the function later.
let getLinks url =
....
|> Seq.toList
let .....
async {
......
links = getLinks url // Tried to modify getLinks to return a list instead of seq
........
links // execution hit this pipe (as a whole)
|> Seq.map (fun l ->
printfn "Downloading" // execution never hit here, tried links as Seq or List
download l)
|> ignore
更新
我知道for in do
有效。为什么Seq.map
没有?
答案 0 :(得分:4)
正如约翰所说,seq
是懒惰的,因为你从未实际遍历过序列(而只是通过ignore
丢弃它),你传递给Seq.map
的lambda中的代码是从未执行过如果您将ignore
更改为Seq.iter ignore
,您将遍历序列并查看所需的输出。 (任何必须遍历序列的函数都可以工作,例如Seq.count |> ignore
。)