当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能Seq.take超过5个值?

如何解决《为什么我不能Seq.take超过5个值?》经验,为你挑选了1个好方法。

在尝试理解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,我可以尽我所能.

有人能向我解释一下吗?为什么我不能超过第五个值?



1> Tomas Petric..:

问题是您正在使用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")


@AvrohomYisroel`Seq`实际上是`IEnumerable` :)的别名``Seq.map`对应于`Enumerable.Select`.
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有