在试图理解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...and它显示正确的数字,无论我传递给它的值。
现在,我试图在序列中打印出第一个(比方说)十个值,而不是上面的代码,它只得到第n个。我试过以下..。
tri_seq |> Seq.take 10 |> Seq.map (fun n -> printfn "%d" n)只打印前五个值的...but。无论为传递给Seq.take的值使用什么,我都只能得到最多5个结果,即使在使用Seq.nth时,我也可以任意使用。
有人能解释给我听吗?为什么我不能超过第五值呢?
发布于 2016-01-07 16:54:42
问题在于您正在使用Seq.map打印这些值。序列是懒惰的,结果序列永远不会被计算--您可以看到5个值,可能是因为F#互动打印了序列的前五个元素。
您可以使用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")https://stackoverflow.com/questions/34660717
复制相似问题