我必须创建一个函数,它给出一个键(作为a String
),一个值(作为a String
)和一个键和值的关联列表(as [(String, String)]
).该函数用于将键/值对添加到列表的末尾,如果键已经存在于具有关联值的列表中,则删除旧值.
我已经尝试使用lookup
键和关联列表,但我不知道如何处理输出 - lookup
函数的输出类型是Maybe String
,我似乎无法对其执行列表函数(如删除元素) .有什么方法可以查看列表并删除任何具有给定键的列表元素,而不知道与之关联的值?
您应该编写一个递归函数,它将新的键/值对和现有列表作为参数,并循环遍历列表以生成插入新值的新列表.对于每个列表元素,检查密钥是否与要插入的密钥相同.如果它不同,则保留旧元素,如果它是相同的,则添加新项而不是旧项.如果到达列表末尾而未找到密钥,则只需在最后插入新项目.
这是一个简单的函数,可以执行您想要的操作。它采用新的键值对并将其放在给定关联列表的前面,并过滤掉该键。
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 的参数中拆分键值对。
归档时间: |
|
查看次数: |
3132 次 |
最近记录: |