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
有);相反,当谓词失败时,元素进入一个单独的组。成功时,元素进入当前组。
关于您的第一个问题,我花了一点时间才弄清楚...x
和 y
不是两个 连续的 元素;相反,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 定义了两个整数 x
和 y
之间的关系,只要乘积 x*y
是 3
的倍数,该关系就成立。因为 3
是素数,所以 x
必须是 3
的倍数,或者 y
必须是这样。
对于输入[1,2,3,4,5,6,7,8,9]
,首先检查1
是否与2
相关。这是错误的,因此 1
获得了自己的单例组 [1]
。然后,我们继续 2
和 3
:现在关系成立,所以 2,3
将共享他们的组。接下来,我们检查 2
和 4
是否相关:这是错误的。因此,该组是 [2,3]
,而且没有更大。然后我们继续 4
和 5
...
我必须承认我不太喜欢这个例子,因为这个关系不是 等价 关系(因为它不是传递性的)。因此,无法保证 groupBy
的确切结果:实现可能会测试 3,4
(true) 而不是 2,4
(false) 上的关系,并构建一个组 [2,3,4]
代替。
引自docs:
The predicate is assumed to define an equivalence.
因此,一旦违反此合同,就无法保证 groupBy
的输出结果。
我对这是如何计算的感到困惑。
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
有);相反,当谓词失败时,元素进入一个单独的组。成功时,元素进入当前组。
关于您的第一个问题,我花了一点时间才弄清楚...x
和 y
不是两个 连续的 元素;相反,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 定义了两个整数 x
和 y
之间的关系,只要乘积 x*y
是 3
的倍数,该关系就成立。因为 3
是素数,所以 x
必须是 3
的倍数,或者 y
必须是这样。
对于输入[1,2,3,4,5,6,7,8,9]
,首先检查1
是否与2
相关。这是错误的,因此 1
获得了自己的单例组 [1]
。然后,我们继续 2
和 3
:现在关系成立,所以 2,3
将共享他们的组。接下来,我们检查 2
和 4
是否相关:这是错误的。因此,该组是 [2,3]
,而且没有更大。然后我们继续 4
和 5
...
我必须承认我不太喜欢这个例子,因为这个关系不是 等价 关系(因为它不是传递性的)。因此,无法保证 groupBy
的确切结果:实现可能会测试 3,4
(true) 而不是 2,4
(false) 上的关系,并构建一个组 [2,3,4]
代替。
引自docs:
The predicate is assumed to define an equivalence.
因此,一旦违反此合同,就无法保证 groupBy
的输出结果。