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] みたいな雰囲気のことをしたくなったりしたので,バランス感覚が重要という感じである.