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