在尝试理解Seq.unfold时,我一直在玩下面的F#,它产生一系列三角形数字......
let tri_seq = 1.0 |> Seq.unfold (fun x -> Some (0.5 * x * (x + 1.0), x + 1.0)) |> Seq.map (fun n -> int n)
这似乎工作正常,因为我可以做以下事情......
tri_seq |> Seq.nth 10
......它显示了正确的数字,无论我传递给它的价值如何.
现在,我正在尝试打印序列中的第一个(比如说)十个值,而不是上面的代码只得到第n个.我试过以下......
tri_seq |> Seq.take 10 |> Seq.map (fun n -> printfn "%d" n)
...但只打印前五个值.无论我使用什么来传递给Seq.take的值,我只得到最多五个结果,即使使用Seq.nth,我可以尽我所能.
有人能向我解释一下吗?为什么我不能超过第五个值?
问题是您正在使用Seq.map
打印值.序列是惰性的,并且永远不会评估结果序列 - 您可能会看到5个值,因为F#Interactive会打印序列的前五个元素.
您可以Seq.iter
在整个序列中使用哪个迭代:
tri_seq |> Seq.take 10 |> Seq.iter (fun n -> printfn "%d" n)
关键的区别在于Seq.map
返回一个新序列,其中包含您指定的函数生成的值Seq.iter
,而不返回任何内容,只是迭代输入.
在这种情况下,您实际上可以使用部分函数应用程序并使代码更短:
tri_seq |> Seq.take 10 |> Seq.iter (printfn "%d")