haskell按功能检查相等

时间:2014-01-17 00:20:19

标签: haskell equivalence

在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

1 个答案:

答案 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)]]

耶!

编辑:

我想了解comparingon的关系。它只是on的专门用途!

> :t comparing
comparing      :: Ord a => (b -> a) -> b -> b -> Ordering
> :t (compare `on`)
(compare `on`) :: Ord b => (a -> b) -> a -> a -> Ordering

(注意类型变量是交换的,但是你可以看到类型是相同的)