我想將 Doubles 與 Data.Map.map 函式相加。
所以我想要一個這樣的功能:
sumTheDoubles :: Mapping.Map Char [(Char, Double)] -> Mapping.Map Char [(Char, Double)]
我想用 Data.Map.map 函式對所有 Doubles 求和:
讓我們說
sumTheDoubles (fromList [('i', [('a', 1.0), ('n', 2.0)])])
應該這樣做: 1.0 2.0 -->
(fromList [('i', [('a', 3.0), ('n', 3.0)])])
然而我的主要問題是,我并不真正了解如何使用 Data.Map.map 函式訪問雙打。
uj5u.com熱心網友回復:
漸漸地,我得到了這個oneliner:
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)])]
uj5u.com熱心網友回復:
構造 a 似乎沒有多大意義Map Char [(Char, Double)]:串列中所有 2 元組的第二項將是相同的。構造 a 更有意義Map Char Double,因此我們總結了值串列的 2 元組的第二項。
我們可以構造這樣的地圖:
sumTheDoubles :: Mapping.Map Char [(Char, Double)] -> Mapping.Map Char Double
sumTheDoubles = fmap (sum . map snd)
我們在這里使用fmap :: Functor f => (a -> b) -> f a -> f b將函式應用于 中的所有值Map,并且對于每個值,我們首先構造原始串列的第二項的串列,然后使用sum將它們相加。
如果您真的想使用元素串列,可以使用:
sumTheDoubles :: Mapping.Map Char [(Char, Double)] -> Mapping.Map Char Double
sumTheDoubles = fmap (\xs -> map (sum (map snd xs) <$) xs)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411550.html
標籤:
下一篇:通過建構式比較值
