在haskell我可以使用
sortBy (comparing snd)
按元组中的第二个值排序。
是否有相同的功能来测试等效性? 我想出了这个,但也许标准库中有一些东西。
equalsBy :: Eq b => (a -> b) -> a -> a -> Bool
equalsBy f x y = f x == f y
最终目标是按第二个值对对列表进行分组。有了这个,我可以做到
groupBy (equalsBy snd) pairs
而不是
groupBy (\x y -> (snd x) == (snd y)) pairs
答案 0 :(得分:14)
您正在寻找一个名为on
的稍高级别的功能:
> import Data.Function
> :t on
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
那我怎么用呢?喜欢这个!
> :t ( (==) `on` snd )
( (==) `on` snd ) :: Eq b => (a, b) -> (a, b) -> Bool
这意味着我们想要:
> groupBy ( (==) `on` snd) [ (1,3), (23,9), (42,9), (1,3), (48, 3), (18,18)]
[[(1,3)],[(23,9),(42,9)],[(1,3),(48,3)],[(18,18)]]
耶!
编辑:
我想了解comparing
与on
的关系。它只是on
的专门用途!
> :t comparing
comparing :: Ord a => (b -> a) -> b -> b -> Ordering
> :t (compare `on`)
(compare `on`) :: Ord b => (a -> b) -> a -> a -> Ordering
(注意类型变量是交换的,但是你可以看到类型是相同的)