所以我想对在元组的第二个元素上进行比较的人员进行排序。
import Data.List (sortBy)
import Data.Function (on)
import Data.Ord (comparing)
data Person = Person (Int, Int) Color deriving (Eq, Show)
getCoordBlockY :: Person-> Int
getCoordBlockY (Person (a,b) _ ) = b
sortPersons :: [Person] -> [Person]
sortPersons lijst = sortBy (compare `on` ( getCoordPersonY . )) lijst
但这无法编译。我将如何在Haskell中进行此操作? 感谢您的帮助。
答案 0 :(得分:3)
我认为您对on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
,on
的基本实现方式有误解:
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
on f g x y = f (g x) (g y)
因此,此函数使用函数g :: a -> b
“预处理”值,然后对两个预处理的参数调用f
。
如果您这样写:
on compare getCoordBlockY :: Person -> Person -> Ordering
因此,您首先获得两个Person
对象的 y 坐标,然后进行比较。
因此,您可以像以下那样实现排序功能:
sortPersons :: [Person] -> [Person]
sortPersons = sortBy (on compare getCoordPersonY)
作为@Bergi的注释,您还可以使用comparing :: Ord b => (a -> b) -> a -> a -> Ordering
,其定义为:
comparing :: Ord b => (a -> b) -> a -> a -> Ordering
comparing = on compare
所以sortPersons
的缩写是:
sortPersons :: [Person] -> [Person]
sortPersons = sortBy (comparing getCoordPersonY)