为什么我不能获得超过5个值?

时间:2016-01-07 16:48:52

标签: f#

在尝试理解Seq.unfold时,我一直在玩下面的F#,它产生一系列三角形数字......

cboISBNsave.Text = dt.Rows(0).Item("book_name")
cboIDSave.Text = dt.Rows(0).Item("member_id")

这似乎工作正常,因为我可以做以下事情......

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)

...它显示了正确的数字,无论我传递给它的任何价值。

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

tri_seq |> Seq.nth 10

...但只打印前五个值。无论我使用什么来传递给Seq.take的值,我只得到最多五个结果,即使使用Seq.nth,我可以尽我所能。

有人能够向我解释这个吗?为什么我无法超越第五个值?

1 个答案:

答案 0 :(得分:6)

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