评估haskell中的“groupBy”

时间:2017-10-31 11:09:48

标签: haskell

为什么

groupBy (>) [-5,-4,5,4,-2,-3,2,3]

评估为

[[-5],[-4],[5,4,-2,-3,2,3]]

由于-3不大于2不应该对它们进行不同的分组? 我希望结果是

[[-5],[-4],[5,4,-2,-3],[2,3]]

我错过了什么?

1 个答案:

答案 0 :(得分:4)

groupBy :: (a -> a -> Bool) -> [a] -> [[a]]使用该群组的第一个成员作为参考。所以,如果你写:

groupBy eq (x:x2:x3)

如果满足eq x x2,请致电eq x x3以检查x3是否也属于同一群组。所以电话是:

arg1 | arg2 | (>) `on` (*1)
  -5 |   -4 | False
  -4 |    5 | False
   5 |    4 | True
   5 |   -2 | True
   5 |   -3 | True
   5 |    2 | True
   5 |    3 | True

我们可以在source code of groupBy

中看到这一点
groupBy                 :: (a -> a -> Bool) -> [a] -> [[a]]
groupBy _  []           =  []
groupBy eq (x:xs)       =  (x:ys) : groupBy eq zs
                           where (ys,zs) = span (eq x) xs

如您所见,spaneq x作为谓词,而x是该群组的第一个成员。

该函数可能希望a -> a -> Bool等价关系:等价关系为(1) reflexive ; (2)对称; (3)传递。您的函数不是等价关系,因为它不是自反的也不是对称的。所以你不能(安全地)使用groupBy订单关系。

注意:(>) `on` (*1)仅相当于(>),因为(*1)将返回相同的数字,您只需使此功能更具体,仅适用于Num s,但这没有必要。