在尝试理解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,我可以尽我所能。
有人能够向我解释这个吗?为什么我无法超越第五个值?
答案 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")