function - 如何编写我自己的 Haskell sortOn 函数
问题描述
我想知道如何编写自己的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]
并且你只是sort
它,该sort
函数将隐式地使用该Ord
实例a
,特别是该函数:
compare :: a -> a -> Ordering
找出a
元素对的相对顺序。
现在,如果你有一个列表[a]
和一个转换函数b
,并且你想用它sortOn
来对转换后的值的列表进行排序,你需要弄清楚b
元素对的相对顺序。你将如何做到这一点?好吧,您将隐式使用该Ord
实例b
,特别是该函数:
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
现在,你能看到如何将它们放在一起定义sortOn
吗?
剧透
进一步提示: 的类型是compare `on` f
什么?
进一步的提示:它是a -> a -> Ordering
.
推荐阅读
- python - 如何在类中保存变量而不会因类继承而丢失变量
- javascript - 如何设置开始视频的秒数?使用 Re4act-Player 库
- javascript - 如何将新元素添加到列表中?
- raspberry-pi - node-serialport 组合 JSON 块
- javascript - Vue 测试库 - fireEvent.click() 不工作
- python-3.x - 如何在 matplotlib imshow 等高线图上显示数据点?
- qt - cmake如何包含shaders.qrc
- graphql - 采用 graphQL 模式 + 一组操作并生成模式子集的工具或代码?
- sparql - Sparql - 连接节点的多个类别的计数
- spring-boot - SpringBatch @Async 方法在持久层中不起作用(JPAItemWriter)