Haskell如何用sort_by与compare_by实现按元组首元素排序功能
实现方案
正确的sort_by_fst定义如下:
sort_by_fst :: Comparator a -> [(a,b)] -> [(a,b)] sort_by_fst cmp = sort_by (compare_by fst cmp)
逻辑说明
- 对元组
(a,b)的列表排序的核心是构造一个适配元组类型的Comparator (a,b)比较器 compare_by的作用就是把针对首元素a的比较器,升级为针对整个元组的比较器:- 第一个参数传取值函数
fst,作用是从元组里取出首元素作为比较依据 - 第二个参数传你输入的
a类型比较器cmp
- 第一个参数传取值函数
- 最后把构造好的元组比较器传给
sort_by,利用柯里化特性,sort_by接收比较器后会返回一个接收列表的函数,刚好匹配sort_by_fst的类型签名
原有写法的问题
你写的sort_by_fst f [(a,b)] = ??存在模式匹配范围过窄的问题,该写法仅能匹配只有一个元素的元组列表,空列表、多元素列表都会匹配失败,不需要手动拆分列表参数,sort_by的内部实现已经处理了所有列表长度的排序逻辑。
测试示例
你可以用标准的compare函数作为比较器测试效果:
-- 测试代码 main :: IO () main = print $ sort_by_fst compare [(2,"b"),(1,"a"),(3,"c"),(2,"d")] -- 输出结果:[(1,"a"),(2,"b"),(2,"d"),(3,"c")]
内容的提问来源于stack exchange,提问作者Nathan Oladimeji
相关产品推荐
相关产品推荐

