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

时间:2009-04-27 15:04:59

标签: list haskell

我必须创建一个给定键(作为String),值(作为String)以及键和值的关联列表的函数(作为{{1 }})。该函数用于将键/值对添加到列表的末尾,如果键已经存在于具有关联值的列表中,则删除旧值。

我已尝试在密钥和关联列表中使用[(String, String)],但我不确定如何处理输出 - lookup函数的输出类型为lookup ,我似乎无法在其上执行列表功能(如删除元素)。有没有什么方法可以查看列表并删除任何具有给定键的列表元素而不知道与之关联的值?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:4)

在Haskell中,我们经常使用Maybe数据类型,因为我们不确定是否会得到一个值或者根本没有得到任何值。它等同于更传统的语言(如Java)中的可空类型。

Maybe定义如下:

data Maybe a = Nothing | Just a

也就是说,该值可以是NothingJust a,其中a是您要查找的对象。例如,如果您使用"foo"函数搜索字符串lookup,并且列表中包含("foo", "bar")元组,则会得到结果Just "bar"。但是,如果您查找"xyzzy",则会获得Nothing

我们可以使用Maybe值并使用maybe函数将其变为更有用的东西(我知道名称混乱 - 函数全部为小写)。它的定义如下:

maybe default f (Just a) = f a
maybe default f Nothing  = default

第一个参数是默认值。如果我们有Nothing,这就是我们得到的。否则,我们会将f函数应用于a,其中a是我们想要的。如果您只想要a,则可以将id函数作为f传递:

maybe default id (Just a) = id a

有帮助,id a = a

如果您想继续使用当前的lookup计划,这就是您可以从中获得有用信息的方法。我个人赞成某种方法 - 它在处理器上更容易。

答案 2 :(得分:4)

这是一个简单的功能,可以满足您的需求。它接受新的键值对,并将其放在给定的关联列表的前面,并将该键过滤掉。

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

函数fst定义为:

fst (first,second) = first

filter获取谓词和列表,并返回仅包含满足谓词的元素的列表。

编辑:按照汤姆的建议拆分addOrReplace参数中的键值对。