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

Haskell中如何对Expense列表的金额进行求和?

解决方案

你的问题核心是没从Expense类型中提取出金额字段,这和Show实例的定义完全无关——Show只是控制数据的打印格式,不影响内部数据的模式匹配。

首先,定义一个提取金额的辅助函数,通过模式匹配直接从MkExpense构造函数中取出金额:

getExpenseAmount :: Expense -> Double
getExpenseAmount (MkExpense amount _) = amount

接下来有两种常用的求和方式:

方式一:map + sum

先把Expense列表转成金额列表,再用sum函数求和:

sumExpenses :: [Expense] -> Double
sumExpenses = sum . map getExpenseAmount

调用示例:

sumExpenses [mkExpense "Alex" 40, mkExpense "Gert-Jan" 200]
-- 输出:240.0

方式二:直接用foldr

如果想直接用foldr,可以在折叠过程中提取金额并累加:

sumExpenses :: [Expense] -> Double
sumExpenses = foldr (\exp acc -> getExpenseAmount exp + acc) 0

这个写法和map + sum本质等价,sum本身就是基于foldr实现的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:40:26