Function 如何编写自己的Haskell-sortOn函数

Function 如何编写自己的Haskell-sortOn函数,function,sorting,haskell,functional-programming,haskell-platform,Function,Sorting,Haskell,Functional Programming,Haskell Platform,我想知道如何编写自己的sortOn函数 我制作了一个sortBy函数和一个on函数,如下所示,但不知道如何组合它们以及要添加哪些附加代码sortOn类似于sortBy,但是给定的函数(在这里命名为comp)只对列表中的每个元素应用一次 sortBy :: (a -> a -> Ordering) -> [a] -> [a] sortBy comp [] = [] sortBy comp [x] = [x] sortBy comp (x:xs) = insert x (so

我想知道如何编写自己的
sortOn
函数

我制作了一个
sortBy
函数和一个
on
函数,如下所示,但不知道如何组合它们以及要添加哪些附加代码
sortOn
类似于
sortBy
,但是给定的函数(在这里命名为
comp
)只对列表中的每个元素应用一次

sortBy :: (a -> a -> Ordering) -> [a] -> [a]
sortBy comp [] = []
sortBy comp [x] = [x]
sortBy comp (x:xs) = insert x (sortBy comp xs)
 where 
  insert x [] = [x]
  insert x (y:ys) 
   | (comp x y == LT) || (comp x y == EQ) = x:y:ys
   | otherwise = y:(insert x ys)

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
on b f x y = b (f x) (f y)
这里有个提示

如果您有一个列表
[a]
,而您只是对它进行
排序
,那么
排序
函数将隐式地使用
Ord
实例,尤其是
a
函数:

compare :: a -> a -> Ordering
compare :: b -> b -> Ordering
计算
a
元素对的相对顺序

现在,如果您有一个列表
[a]
和一个转换函数
b
,并且您想使用
sortOn
对转换值列表进行排序,那么您需要计算出
b
元素对的相对顺序。你将如何做到这一点?那么,您将隐式地使用
Ord
实例来表示
b
,特别是函数:

compare :: a -> a -> Ordering
compare :: b -> b -> Ordering
换句话说,当您试图定义:

sortOn :: (Ord b) => (a -> b) -> [a] -> [a]
sortOn f lst = ...
您将拥有以下类型的参数:

f :: a -> b
lst :: [a]
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
compare :: b -> b -> Ordering
和其他类型的对象:

f :: a -> b
lst :: [a]
sortBy :: (a -> a -> Ordering) -> [a] -> [a]
on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
compare :: b -> b -> Ordering
现在,您可以看到如何将它们放在一起来定义
sortOn

破坏者 进一步提示:f上的
compare`类型是什么

进一步提示:这是
a->a->Ordering