2011-09-19 63 views
5

我想使用Data.List.groupBy根据snd元素的等同性对元组列表进行分组。
我可以这样做:有没有一个标准的库解决这个Haskell问题?

groupBy (\l r -> snd l == snd r) listOfTuples 

但是这让我在比较功能太多样板 - 尤其是因为它可以得到更多的混乱,如果我在做一个更复杂的比较。我想这样做:

groupBy (comparing snd) listOfTuples 

,但比较的类型签名是comparing :: (Ord a) => (b -> a) -> b -> b -> Ordering,所以它不会在这个例子编译。
我也可以这样做:

groupBy (\l r -> (comparing snd l r) == EQ) listOfTuples 

但是,这并不比第一次尝试更好。在我推出自己的产品之前,是否有标准库解决方案来解决这个问题?

回答

15
groupBy ((==) `on` snd) listOfTuples 

我认为那里曾经是标准库中的equating = on (==),虽然我现在似乎无法找到它。

+0

'on'来自哪个软件包? –

+3

@Matt:Data.Function(http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-Function.html#v:on)通常你可以在hoogle上搜索函数: http://www.haskell.org/hoogle/?hoogle=on – porges

+0

@Porges:谢谢! –

-1

这是你想要的吗?

groupBy ((==EQ) . comparing snd) listOfTuples 
+0

这不会编译 –

+0

嗯,我一直在想。是神奇的。但可惜的不是。我认为有一个提升功能可能会做类似的事情。 'lift ::(a→b)→c→d→b→c→d'。 @Daniel Wagner建议Hoogle让我“开心”。 – nulvinge

+2

你可以写成'groupBy(((== EQ)。)。比较snd)listOfTuples'。请注意部分应用的功能组成。 – hammar

相关问题