6

Haskellで使用できます

sortBy (comparing snd) 

タプルの 2 番目の値でソートします。

同等性をテストするための同等の機能はありますか? 私はこれを思いつきましたが、標準ライブラリに何かがあるかもしれません。

equalsBy :: Eq b => (a -> b) -> a -> a -> Bool
equalsBy f x y = f x == f y

最終的な目標は、ペアのリストを 2 番目の値でグループ化することです。これで私はできる

groupBy (equalsBy snd) pairs

それ以外の

groupBy (\x y -> (snd x) == (snd y)) pairs
4

1 に答える 1

16

と呼ばれる少し高いレベルの関数を探しています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との関係に注目したいonon!の特殊な使用法にすぎません。

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

(型変数が入れ替わっていることに注意してください。ただし、型が同一であることがわかります)

于 2014-01-17T01:01:37.713 に答える