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)
(注意类型变量是交换的,但是你可以看到类型是相同的)