gpt4 book ai didi

dictionary - 更新 Haskell Map 中的项目,如何?

转载 作者:行者123 更新时间:2023-12-03 18:45:41 25 4
gpt4 key购买 nike

我是 Haskell 的新手,正在尝试找出一个明智的
写入 map 的方式(为解决特定问题做准备
欧拉项目问题)

我希望编写一个可以填充的函数
带有记录的 map 。但我无法让它工作。
let似乎创建局部变量而不是
治疗 smap作为一个全局性的。

必须有某种方法可以做到这一点。

我的代码:

import Data.Map (Map)
import qualified Data.Map as Map

smap = Map.fromList [("cocoa",23)]


newdata str n = do
let cpy = Map.insert str n smap
cpy

main = do
let smap = newdata "pennywise" 16
let smap = newdata "krusty" 18

评论更新:稍后我想计算直角三角形等于周长的方式。所以我认为 Map 是存储分布计数的好方法,例如p10 -> 5 种方式,p15 -> 6 种方式等。所以当程序运行时,它会增加已经发现的周长值。

最佳答案

您不能修改 Map就地(因为 Haskell 是一种纯函数式语言),但您可以创建一个几乎与旧映射相同的新映射,除了一些已修改的条目。

(不要太担心效率:与直觉相反,新的 Map 不需要旧版本的完整副本。)

例如,假设我们要计算字符串中每个字符的频率。让我们写一个函数,给定一个字符 c , 增加其存储在 Map 中的计数

import qualified Data.Map.Strict as M

countChar :: Char -> M.Map Char Int -> M.Map Char Int
countChar c oldMap = newMap
where
newMap = M.insertWith (+) c 1 oldMap
newMap变量不是必需的,为了清楚起见,它在上面显示。

函数 insertWith制作新 map ,以便在索引 c如果旧 map 中没有值,则存储 1,或 1 + x如果有前一个值 x在旧 map 中。

为了处理一个完整的字符串,我们使用递归:
countString :: String -> M.Map Char Int
countString "" = M.empty
countString (c:cs) = countChar c (countString cs)

GHCi中的小测试:
> countString "here's an example"
fromList [(' ',2),('\'',1),('a',2),('e',4),('h',1),('l',1),('m',1)
,('n',1),('p',1),('r',1),('s',1),('x',1)]

如需更高级的解决方案, countString如果需要,也可以将其重写为折叠。使用左严格折叠也可以提高效率。
countString = foldl' (flip countChar) M.empty

甚至可以使用 state monad 来避免绕过 Map .如果您正在学习 Haskell,请不要担心,首先学习如何使用递归、模式匹配和一些库函数来解决这些类型的任务 Map s。

关于dictionary - 更新 Haskell Map 中的项目,如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51179828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com