gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:23:24 24 4
gpt4 key购买 nike

在尝试理解 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 时,我可以想走多远就走多远。

谁能给我解释一下?为什么我不能超过第五个值?

最佳答案

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

关于f# - 为什么我 Seq.take 不能超过 5 个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34660717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com