haskell按功能检查相等

Eri*_*ten 6 haskell equivalence

在haskell我可以使用

sortBy (comparing snd) 
Run Code Online (Sandbox Code Playgroud)

按元组中的第二个值排序.

是否有相同的功能来测试等效性?我想出了这个,但也许标准库中有一些东西.

equalsBy :: Eq b => (a -> b) -> a -> a -> Bool
equalsBy f x y = f x == f y
Run Code Online (Sandbox Code Playgroud)

最终目标是按第二个值对对列表进行分组.有了这个,我能做到

groupBy (equalsBy snd) pairs
Run Code Online (Sandbox Code Playgroud)

代替

groupBy (\x y -> (snd x) == (snd y)) pairs
Run Code Online (Sandbox Code Playgroud)

Tho*_*son 15

您正在寻找一个稍高级别的函数,名为on:

> import Data.Function
> :t on
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
Run Code Online (Sandbox Code Playgroud)

那我怎么用呢?像这样!

> :t ( (==) `on` snd )
( (==) `on` snd ) :: Eq b => (a, b) -> (a, b) -> Bool
Run Code Online (Sandbox Code Playgroud)

这意味着我们想要:

> 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)]]
Run Code Online (Sandbox Code Playgroud)

好极了!

编辑:

我想说明如何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
Run Code Online (Sandbox Code Playgroud)

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