Haskell:用关联列表中的给定键替换元素

ben*_*wad 1 haskell list

我必须创建一个函数,它给出一个键(作为a String),一个值(作为a String)和一个键和值的关联列表(as [(String, String)]).该函数用于将键/值对添加到列表的末尾,如果键已经存在于具有关联值的列表中,则删除旧值.

我已经尝试使用lookup键和关联列表,但我不知道如何处理输出 - lookup函数的输出类型是Maybe String,我似乎无法对其执行列表函数(如删除元素) .有什么方法可以查看列表并删除任何具有给定键的列表元素,而不知道与之关联的值?

sth*_*sth 6

您应该编写一个递归函数,它将新的键/值对和现有列表作为参数,并循环遍历列表以生成插入新值的新列表.对于每个列表元素,检查密钥是否与要插入的密钥相同.如果它不同,则保留旧元素,如果它是相同的,则添加新项而不是旧项.如果到达列表末尾而未找到密钥,则只需在最后插入新项目.


Pet*_*rns 5

这是一个简单的函数,可以执行您想要的操作。它采用新的键值对并将其放在给定关联列表的前面,并过滤掉该键。

addOrReplace :: Eq k => k -> v -> [(k, v)] -> [(k, v)]
addOrReplace key value assoc = (key,value):(filter ((key /=).fst) assoc)
Run Code Online (Sandbox Code Playgroud)

该函数fst定义为:

fst (first,second) = first
Run Code Online (Sandbox Code Playgroud)

filter 接受一个谓词和一个列表,并返回仅包含满足谓词的那些元素的列表。

编辑:按照 Tom 的建议,在 addOrReplace 的参数中拆分键值对。