You need to enable JavaScript to run this app. Haskell实现元组列表新增:存在则增量否则新增,要求用模式匹配递归
优惠活动
大模型
产品
解决方案
定价
更多

Haskell实现元组列表新增:存在则增量否则新增,要求用模式匹配递归

实现方案

可以直接通过单次递归+模式匹配完成需求,不需要额外的存在性检查函数,仅需一次列表遍历即可完成逻辑:

核心思路

遍历商品列表时逐个匹配元素:

  1. 递归边界:如果遍历到列表为空,说明没有找到同名商品,直接返回待插入商品作为结果
  2. 如果当前遍历到的头部元素和待插入商品名称一致,直接修改头部元素的库存数,拼接剩余未遍历的列表即可终止递归
  3. 如果名称不一致,保留当前头部元素,递归处理剩余的列表部分

代码实现

type Product = (String, Int, Float)

addProduct :: Product -> [Product] -> [Product]
-- 空列表边界:直接插入商品
addProduct p [] = [p]
-- 匹配待插入商品字段 + 列表头部元素
addProduct (name, addCnt, price) ((currName, currCnt, currPrice):xs)
  | name == currName = (name, currCnt + addCnt, price) : xs
  | otherwise = (currName, currCnt, currPrice) : addProduct (name, addCnt, price) xs

效果验证

  • 测试示例1:传入("Beer", 9, 3) [("Beer", 1, 3),("Milk", 3, 3),("Tea", 10, 3)],匹配到第一个元素名称一致,库存相加后直接拼接剩余列表,得到结果[("Beer",10,3),("Milk",3,3),("Tea",10,3)],符合预期
  • 测试示例2:传入("Apple", 2, 1) [("Beer", 1, 3),("Milk", 3, 3),("Tea", 10, 3)],遍历完全部元素未匹配到同名商品,最后在末尾追加Apple记录,符合预期

相比原实现,这个版本仅需要最多一次列表遍历,匹配到目标后就会终止递归,性能更优。


内容的提问来源于stack exchange,提问作者Saturas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 13:06:01