用于列表的Haskell多变量Lambda函数

时间:2015-01-08 16:34:30

标签: haskell lambda

我很困惑如何计算它。

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

3 个答案:

答案 0 :(得分:2)

回答你的第二个问题:我们通过乘以它们并看看结果是否可以被3整除来比较两个元素。"那么为什么输出中的元素不能被3整除?"如果它们不可分割,则不会将它们过滤掉(这是filter的作用);相反,当谓词失败时,元素进入一个单独的组。成功后,元素将进入当前组。

至于你的第一个问题,我花了一点时间才弄明白...... xy不是两个连续的元素;相反,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定义了两个整数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),并构建一个组{{1相反。

引用docs

  

假设谓词定义了等价。

因此,一旦违反此合同,就无法保证[2,3,4]的输出可能是什么。