【发布时间】:2021-07-31 10:09:24
【问题描述】:
我想知道为什么 groupBy 的以下调用不起作用:我的谓词是 x < y,所以我希望 [1, 6] 是一个组,但是 Haskell 将 [1, 6, 4, 2] 放入一个组中。
Prelude Data.List> groupBy (\x y -> x < y) [8,5,3,2,1,6,4,2]
[[8],[5],[3],[2],[1,6,4,2]]
更奇怪的是,当我将最后一个数字更改为 -2 时,我期望的行为与上面的示例相同。也就是说,由于 2 和 -2 都小于 4,我希望在结果中 [1, 6, 4, -2] 将组成一个组。但是,这一次,Haskell 将 -2 设置为一个组。
Prelude Data.List> groupBy (\x y -> x < y) [8,5,3,2,1,6,4,-2]
[[8],[5],[3],[2],[1,6,4],[-2]]
是不是我对groupBy的理解有误?
【问题讨论】:
-
groupBy旨在与 等价关系 一起使用,特别是在groupBy p中,您应该使用p x y ≡ p y x。但是,我很惊讶这实际上是一个要求... -
我的意思是,这不是必需的。你可以将任何你想要的函数传递给
groupBy。但是,如果您使用令人惊讶的相等谓词,您可能会得到一组令人惊讶的组。 -
@leftaroundabout @amalloy 谢谢。我不知道
groupBy“需要”相等关系。不过,知道为什么 -2 的处理方式与 2 不同会很有趣 -
x始终是所构造组的第一个项。
标签: haskell