haskell - 使用 Data.Map.map 对值求和

标签 haskell

我想使用 Data.Map.map 函数对 Double 进行求和。

所以我想要一个这样的功能:

sumTheDoubles :: Mapping.Map Char [(Char, Double)] -> Mapping.Map Char [(Char, Double)]

我想用 Data.Map.map 函数对所有 double 求和:

可以说

sumTheDoubles (fromList [('i', [('a', 1.0), ('n', 2.0)])])

应该做:​1.0 + 2.0 -->

(fromList [('i', [('a', 3.0), ('n', 3.0)])])

但我的主要问题是,我并不真正了解如何使用 Data.Map.map 函数访问 double 。

最佳答案

渐渐地,我得到了这个单线:

sumTheDoubles' f = Mapping.map (\a -> map ((\b -> \(c,d) -> (c,b)) ((sum.map snd) a)) a) f

我是如何得到这个结果的? 我从最高级别开始。然后我根据需要定义了越来越多的函数。我总是首先确定单个功能的类型。最后,我将函数转换为 lambda 形式(从底部开始)并将它们应用到顶层。

module Main where

import qualified Data.Map as Mapping

sumTheDoubles :: Mapping.Map Char [(Char, Double)] -> Mapping.Map Char [(Char, Double)]
sumTheDoubles a = Mapping.map map2 a

-- combine sum and replace
map2 :: [(Char, Double)] -> [(Char, Double)]
map2 a = map (map3 $ map4 a) a

-- replace snd
map3 :: Double -> (Char, Double) -> (Char, Double)
map3 a (b,c) = (b,a)

-- sum Doubles
map4 :: [(Char, Double)] -> Double
map4 a = (sum.map snd) a

main = putStrLn $ show $ sumTheDoubles $ Mapping.fromList [('i', [('a', 1.0), ('n', 2.0)])]

输出:

fromList [('i',[('a',3.0),('n',3.0)])]

关于haskell - 使用 Data.Map.map 对值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70688831/

相关文章:

haskell - 对Haskell Monad变形金刚感到困惑

haskell - 如何在 Haskell 中构建无限网格状数据结构?

haskell - Tree 实现 Foldable FoldMap 时 Foldr/Foldl 是免费的吗?

haskell - 为什么 Safe Haskell 不支持 Template Haskell?

haskell - 将 Int 或 Integer 转换为 [Word8] 或 [Bit]

sql - 在Haskell中进行部分SQL插入

haskell - curried 和 uncurried 函数

haskell - 由于前奏不明确,无法构建 cabal 包

list - Haskell IO 创建一个字符串列表并显示它

haskell - "curl libraries?"在哪里