如何编写sortBy,unionBy等更简洁的lambda函数

时间:2013-12-07 22:20:46

标签: list sorting haskell lambda

sortByunionBy这样的函数将lambda函数作为参数。从列表元素中取出一部分后,lambda函数通常会compareeq。例如,

f v1 v2 = sortBy (\x y -> compare (fst x) (fst y)) $ 
            unionBy (\x y -> (fst x) == (fst y)) (zip v1 [0..]) (zip v2 [0..])

只是想知道lambda函数\x y -> compare (fst x) (fst y)是否可以更简洁地编写。

3 个答案:

答案 0 :(得分:7)

除了已经提及的on之外,Data.Ord中的comparing函数可直接应用于此处。

\x y -> compare (f x) (f y) === comparing f 

答案 1 :(得分:4)

我找到了

compare `on` fst
当我必须写\x y -> compare (fst x) (fst y)时,

是我写的。

您可以在on :: (b -> b -> c) -> (a -> b) -> a -> a -> c中找到Data.Function。所以你的代码将是

f v1 v2 = sortBy (compare `on` fst) $ 
            unionBy ((==) `on` fst) (zip v1 [0..]) (zip v2 [0..])

答案 2 :(得分:3)

我喜欢Data.Function的on函数。

import Data.Function (on)
import Data.List

f v1 v2 = sortBy (compare `on` fst) $ 
        unionBy ((==) `on` fst) (zip v1 [0..]) (zip v2 [0..])