You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:54:06