我很困惑如何计算它。
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
答案 0 :(得分:2)
回答你的第二个问题:我们通过乘以它们并看看结果是否可以被3整除来比较两个元素。"那么为什么输出中的元素不能被3整除?"如果它们不可分割,则不会将它们过滤掉(这是filter
的作用);相反,当谓词失败时,元素进入一个单独的组。成功后,元素将进入当前组。
至于你的第一个问题,我花了一点时间才弄明白...... x
和y
不是两个连续的元素;相反,y
是当前元素,x
是当前组中的第一个元素。 (!)
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,正如您可能合理预期的那样。
答案 1 :(得分:1)
The groupBy function获取一个列表并返回一个列表列表,以便结果中的每个子列表仅包含相同的元素,基于您提供的相等函数。
在这种情况下,您正在尝试查找所有子列表元素x和y,mod (x*y) 3
== 0
的所有子集(以及它没有' t == 0的子集) 。有点奇怪,但你去了。 groupBy
仅查看相邻元素。 sort
列表,以减少重复集的数量。
答案 2 :(得分:1)
首先,x和y是否指向当前和下一个元素?
粗略地说,是的。
其次,这是说当它被3修改时它会将等于0的元素分组吗?如果是这样,在输出中由3修改时,为什么有些元素不等于0?
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),并构建一个组{{1相反。
引用docs:
假设谓词定义了等价。
因此,一旦违反此合同,就无法保证[2,3,4]
的输出可能是什么。