排序自定义数据类型

时间:2018-10-21 13:28:40

标签: haskell functional-programming

所以我想对在元组的第二个元素上进行比较的人员进行排序。

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中进行此操作? 感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

我认为您对on :: (b -> b -> c) -> (a -> b) -> a -> a -> con的基本实现方式有误解:

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)