gpt4 book ai didi

f# - Seq.filter 和 infinite 似乎违反直觉

转载 作者:行者123 更新时间:2023-12-02 06:31:50 25 4
gpt4 key购买 nike

我试图了解对无限列表应用过滤器的结果。我需要一个解释来了解幕后发生的事情。

let nums = Seq.initInfinite id |> Seq.filter ((>) 0);;
nums |> Seq.take 0;; // of course, this works
nums |> Seq.take 1;; // this overflows

根据我的理解,第一行的意思是“从零开始一个无限序列并过滤掉所有大于零的值(例如 1、2、3 等...)”。因此,获得零值将返回一个空集。好的,有道理。但是,如果我们取一个值,而该值将为零,显然不大于零,为什么会溢出?

进一步试验:

let nums = Seq.initInfinite (fun i -> i - 1) |> Seq.filter ((>) 0);;
nums |> Seq.take 1;; // this works and returns -1
nums |> Seq.take 2;; // this overflows

再一次,正如我读到的那样,零应该是序列可以迭代到的有效值。

复合我的困惑:

let nums = Seq.initInfinite id |> Seq.filter ((>=) 0);;
nums |> Seq.take 1;; // works, [0]

也许我可以通过假设过滤器实际上意味着“值无效,除非它们 >= 0”来协调行为。但这并不值得:

let nums = Seq.initInfinite (fun i -> i - 1) |> Seq.filter ((>=) 0);;
nums |> Seq.take 1;; // works [-1]
nums |> Seq.take 2;; // works [-1, 0]

过滤器 ((> =) 0)

不可能是过滤器定义无效 值...对于 filter ((>) 0 而言,0 不是 > 0 )

请帮我解读一下。

最佳答案

由于您使用谓词的方式,它的实际含义非常困惑。让我们首先解决这个问题,方法是通过过滤器推送具有已知值集的有限序列。

> let input = [-5; 0; 5 ];;
val input : int list = [-5; 0; 5]

> let output = input |> Seq.filter ((>) 0) |> Seq.toList;;
val output : int list = [-5]

等等,为什么返回-5?那是因为(>) 0其实并不是x > 0的意思,而是(>) 0 x的意思,相当于 0 > x。所以你的 Seq.filter ((>) 0)Seq.filter (fun i -> 0 > i) 的含义相同:

> let output = input |> Seq.filter (fun i -> 0 > i) |> Seq.toList;;
val output : int list = [-5]

现在我们已经弄清楚了,让我们尝试查看溢出。

let nums = Seq.initInfinite id |> Seq.filter ((>) 0);;

Seq.initInfinite id 返回一个无限集合,从 0 开始,下一个元素等于 prev + 1

> Seq.initInfinite id |> Seq.take 5 |> Seq.toList;;
val it : int list = [0; 1; 2; 3; 4] // this will keep going if you remove Seq.take

现在您要添加过滤器,它只返回小于 0 的元素。这样的元素有多少? 没有!。因此,您的过滤器将不断询问 Seq.initInfinite 之外的下一个元素,直到您溢出 Integer 范围并抛出异常。

关于f# - Seq.filter 和 infinite 似乎违反直觉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33624076/

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