Haskell实现元组列表新增:存在则增量否则新增,要求用模式匹配递归
实现方案
可以直接通过单次递归+模式匹配完成需求,不需要额外的存在性检查函数,仅需一次列表遍历即可完成逻辑:
核心思路
遍历商品列表时逐个匹配元素:
- 递归边界:如果遍历到列表为空,说明没有找到同名商品,直接返回待插入商品作为结果
- 如果当前遍历到的头部元素和待插入商品名称一致,直接修改头部元素的库存数,拼接剩余未遍历的列表即可终止递归
- 如果名称不一致,保留当前头部元素,递归处理剩余的列表部分
代码实现
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
相关产品推荐
相关产品推荐

