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)))
逻辑说明:
- 遍历钱包中的每个资产项
(asset, quantity); - 用
filter ((== asset) . fst)从报价列表中筛选出名称匹配的资产报价; - 用
map snd提取筛选结果中的价格(无匹配项时得到空列表); - 用
sum计算价格总和(空列表的sum为0,正好对应不存在的资产价值为0); - 将价格总和乘以持有数量,得到该资产的总价值;
- 最后用外层的
sum把所有资产的价值累加,得到钱包的总价值。
这个实现完全遵循题目要求,只使用了组合符、sum、map和filter,同时处理了不存在的资产(贡献0价值)的情况,和示例表现一致。
内容的提问来源于stack exchange,提问作者Metiwi
相关产品推荐
相关产品推荐

