像sortBy
和unionBy
这样的函数将lambda函数作为参数。从列表元素中取出一部分后,lambda函数通常会compare
或eq
。例如,
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)
是否可以更简洁地编写。
答案 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..])