Сортировка пользовательского типа данных - PullRequest
0 голосов
/ 21 октября 2018

Итак, я хотел бы отсортировать список лиц, сравнивающих их по второму элементу кортежа.

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

Но это не компилируется.Как мне поступить в Хаскеле?Спасибо за помощь.

1 Ответ

0 голосов
/ 21 октября 2018

Я думаю, у вас есть некоторое недопонимание того, как 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

, вы сначала получите y -координация двух Person объектов, а затем сравнить их.

Таким образом, вы можете реализовать свою функцию сортировки следующим образом:

sortPersons :: [Person] -> [Person]
sortPersons = sortBy (on compare getCoordPersonY)

As @ 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...