Xeebi

home categories feeds

Haskell で指定の関数の結果を使って sort したい

Haskell でリストに対して任意の関数を適用した結果を使ってソートしたい.python で言うと

# a is a list
a.sort(key = lambda x: str(x)[::-1])

みたいな感じ.

なんか sortBy とかあったなーと思って書くと型がちゃうで,とエラーが出る.

sortBy :: (a -> a -> Ordering) -> [a] -> [a]

ということで,Ordering ってのは compare が吐くような LT とかそういうので,これは python でいうと多分 __comp__ を自前で定義するのにちかそう.

というわけで Hoogle で検索しよう.

(Ord b) => (a -> b) -> [a] -> [a]

とかこの辺りのはず.とりあえずこれで検索すると見事にあって,名前が近いけど僕が欲しかったのは GHC.Exts にある sortWith.

The sortWith function sorts a list of elements using the user supplied function to project something out of each element.

とのことで,まさにこれが欲しかったものっぽい.多分元を正せば sortBy で書いているんだろうなーと思って ソースを見てみると,

sortWith :: Ord b => (a -> b) -> [a] -> [a]
sortWith f = sortBy (\x y -> compare (f x) (f y))

ははぁなるほど綺麗なもんだ(部分適用のところまでしか書いていないのも綺麗だよね). 自分で書こうとした時には compareWith f [x,y] みたいな雰囲気のことをしたくなったりしたので,バランス感覚が重要という感じである.