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
相关产品推荐
相关产品推荐

