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

Haskell列表过滤组合实现walletValue函数问题求助

Haskell练习题:仅用指定工具实现walletValue函数

我正在做一道Haskell练习题,要求只能使用组合符(.)、sum、map和filter来定义函数walletValue :: [(String,Double)] -> [(String,Double)] -> Double。这个函数要根据给定的报价列表(由资产名称和对应价格的元组组成),计算钱包列表(由资产名称和持有数量的元组组成)的总价值。

示例如下:

quote = [("apple", 116), ("intel", 35), ("google", 824), ("nvidia", 67)]

> walletValue [("intel", 1), ("nvidia", 1)] quote
102.0

> walletValue [("intel", 3), ("nvidia", 2)] quote
239.0

> walletValue [("intel", 3), ("facebook", 4), ("nvidia", 2)] quote
239.0

我已经写出了一个解决方案,但没用到map和filter的组合,现在需要符合要求的实现方式。我的代码如下:

walletValue:: [(String,Double)] -> [(String,Double)] -> Double
walletValue xs ys = sum.concat.(map (\(k,v)-> map (v*) (searchC k ys))) xs

searchC :: Eq a => a -> [(a,b)] -> [b]
searchC k xs = [ v | (k',v) <- xs,k==k'] -- 修正了原代码的变量名笔误

符合要求的实现方式

这里给出完全依赖指定工具的实现,核心思路是通过filter匹配资产名称,map提取价格,再结合sum和组合符完成计算:

walletValue :: [(String, Double)] -> [(String, Double)] -> Double
walletValue = sum . map (\(asset, quantity) -> quantity * (sum . map snd . filter ((== asset) . fst)))

逻辑说明:

  1. 遍历钱包中的每个资产项(asset, quantity);
  2. 用filter ((== asset) . fst)从报价列表中筛选出名称匹配的资产报价;
  3. 用map snd提取筛选结果中的价格(无匹配项时得到空列表);
  4. 用sum计算价格总和(空列表的sum为0,正好对应不存在的资产价值为0);
  5. 将价格总和乘以持有数量,得到该资产的总价值;
  6. 最后用外层的sum把所有资产的价值累加,得到钱包的总价值。

这个实现完全遵循题目要求,只使用了组合符、sum、map和filter,同时处理了不存在的资产(贡献0价值)的情况,和示例表现一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 22:00:16