Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dictionary 用Data.Map.adjust折叠_Dictionary_Haskell_Iteration_Fold - Fatal编程技术网

Dictionary 用Data.Map.adjust折叠

Dictionary 用Data.Map.adjust折叠,dictionary,haskell,iteration,fold,Dictionary,Haskell,Iteration,Fold,我试图通过迭代一个键列表来获得正确的函数,该函数将更新一个或多个值 例如: s1 = Data.Map.fromList [(1,"value1"), (2,"value2"), (3,"value3")] 通过向函数传递列表[1,2]和更新值“plus”,列表应如下所示: [(1,"plus"), (2,"plus"), (3,"value3")] import qual

我试图通过迭代一个键列表来获得正确的函数,该函数将更新一个或多个值

例如:

s1 = Data.Map.fromList [(1,"value1"), (2,"value2"), (3,"value3")]
通过向函数传递列表
[1,2]
和更新值
“plus”
,列表应如下所示:

[(1,"plus"), (2,"plus"), (3,"value3")]
import qualified Data.Map.Strict as M

s1 = M.fromList [(1,"value1"), (2,"value2"), (3,"value3")]

changeValue m newValue ks = foldr (\k m -> M.adjust (const newValue) k m) m ks

main :: IO ()
main = do
    print $ changeValue s1 "plus" [1, 2]
这是我到目前为止所做的尝试,我很难实现在要更新的键列表上迭代的函数

changeValue map newValue xs = foldr (\k map -> Map.adjust (newValue)(xs)(sm)) map m

我应该从那里寻找什么?我认为在这种情况下我不能使用
map

好吧,你说得对

折叠确实是你需要的。你需要把钥匙的清单折叠起来。起始值是您的原始贴图,并且在折叠过程中进行变换

您还正确识别了功能调整

adjust
需要一个函数作为第一个参数。这个函数是
\\->newValue
,或者只是
const newValue
。我会远离使用名称
map
,因为它可能会引起混淆

经过这些更正后,您的程序可能会如下所示:

[(1,"plus"), (2,"plus"), (3,"value3")]
import qualified Data.Map.Strict as M

s1 = M.fromList [(1,"value1"), (2,"value2"), (3,"value3")]

changeValue m newValue ks = foldr (\k m -> M.adjust (const newValue) k m) m ks

main :: IO ()
main = do
    print $ changeValue s1 "plus" [1, 2]

看起来您正在容器中使用一个映射模块。是否适合您?在这种情况下,
foldl'
是比
foldr
更好的选择。