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