Haskell 列表的多变量 Lambda 函数

Haskell multivariable Lambda function for lists

我对这是如何计算的感到困惑。

Input: groupBy (\x y -> (x*y `mod` 3) == 0) [1,2,3,4,5,6,7,8,9]

Output: [[1],[2,3],[4],[5,6],[7],[8,9]]

首先,x和y是指当前元素还是下一个元素?

其次,这是说当它被3模化时,它会将等于0的元素分组吗?如果是,怎么输出的结果中有元素被3模化后不等于0?

在此处找到:http://zvon.org/other/haskell/Outputlist/groupBy_f.html

The groupBy function 采用一个列表和 returns 一个列表列表,根据您提供的相等函数,结果中的每个子列表只包含相等的元素。

在这种情况下,您试图找到所有子列表元素 x 和 y 的所有子集,其中 mod (x*y) 3 == 0(以及不为 == 0 的子集) .有点奇怪,但你去吧。 groupBy 只看相邻元素。 sort减少重复集数的列表。

回答您的第二个问题:我们通过将两个元素相乘并查看结果是否可以被 3 整除来比较它们。"So why are there elements in the output not divisible by 3?"如果它们不能被 3 整除,则不会将它们过滤掉(就是这样filter 有);相反,当谓词失败时,元素进入一个单独的组。成功时,元素进入当前组。

关于您的第一个问题,我花了一点时间才弄清楚...xy 不是两个 连续的 元素;相反,y 是当前元素,x 是当前组中的 first 元素。 (!)

1 * 2 = 2; 2 `mod` 3 = 2; 1 and 2 go in separate groups.
2 * 3 = 6; 6 `mod` 3 = 0; 2 and 3 go in the same group.
2 * 4 = 8; 8 `mod` 3 = 2; 4 gets put in a different group.
...

请注意,在最后一行,我们正在查看 2 和 4,而不是您可能合理预期的 3 和 4。

First, does x and y refer to the current and the next element?

大致是这样。

Second, is this saying that it will group the elements that equal 0 when it is modded by 3? If so, how come there are elements that are not equal to 0 when modded by 3 in the output?

lambda 定义了两个整数 xy 之间的关系,只要乘积 x*y3 的倍数,该关系就成立。因为 3 是素数,所以 x 必须是 3 的倍数,或者 y 必须是这样。

对于输入[1,2,3,4,5,6,7,8,9],首先检查1是否与2相关。这是错误的,因此 1 获得了自己的单例组 [1]。然后,我们继续 23:现在关系成立,所以 2,3 将共享他们的组。接下来,我们检查 24 是否相关:这是错误的。因此,该组是 [2,3],而且没有更大。然后我们继续 45 ...

我必须承认我不太喜欢这个例子,因为这个关系不是 等价 关系(因为它不是传递性的)。因此,无法保证 groupBy 的确切结果:实现可能会测试 3,4 (true) 而不是 2,4 (false) 上的关系,并构建一个组 [2,3,4] 代替。

引自docs

The predicate is assumed to define an equivalence.

因此,一旦违反此合同,就无法保证 groupBy 的输出结果。