为什么
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]]
我错过了什么?
答案 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
如您所见,span
将eq x
作为谓词,而x
是该群组的第一个成员。
该函数可能希望a -> a -> Bool
为等价关系:等价关系为(1) reflexive ; (2)对称; (3)传递。您的函数不是等价关系,因为它不是自反的也不是对称的。所以你不能(安全地)使用groupBy
订单关系。
注意:(>) `on` (*1)
仅相当于(>)
,因为(*1)
将返回相同的数字,您只需使此功能更具体,仅适用于Num
s,但这没有必要。