首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能Seq.take超过5个值?

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

Stack Overflow用户
提问于 2016-01-07 16:48:52
回答 1查看 108关注 0票数 2

在试图理解Seq.unfold的同时,我一直在使用下面的F#来生成三角形数字的序列.

代码语言:javascript
复制
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)

这似乎很好,因为我可以做下面的事情.

代码语言:javascript
复制
tri_seq |> Seq.nth 10

...and它显示正确的数字,无论我传递给它的值。

现在,我试图在序列中打印出第一个(比方说)十个值,而不是上面的代码,它只得到第n个。我试过以下..。

代码语言:javascript
复制
tri_seq |> Seq.take 10 |> Seq.map (fun n -> printfn "%d" n)

只打印前五个值的...but。无论为传递给Seq.take的值使用什么,我都只能得到最多5个结果,即使在使用Seq.nth时,我也可以任意使用。

有人能解释给我听吗?为什么我不能超过第五值呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-07 16:54:42

问题在于您正在使用Seq.map打印这些值。序列是懒惰的,结果序列永远不会被计算--您可以看到5个值,可能是因为F#互动打印了序列的前五个元素。

您可以使用Seq.iter对整个序列进行迭代:

代码语言:javascript
复制
tri_seq |> Seq.take 10 |> Seq.iter (fun n -> printfn "%d" n)

关键的区别是,Seq.map返回一个新的序列,其中包含您指定的函数生成的值,而Seq.iter不返回任何内容,只对输入进行迭代。

在这种情况下,您实际上可以使用部分函数应用程序,并使代码更短一点:

代码语言:javascript
复制
tri_seq |> Seq.take 10 |> Seq.iter (printfn "%d")
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34660717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档