将数据添加到列表中

时间:2011-03-15 20:58:26

标签: haskell

说我有一个列表,我希望将名称和年龄添加到表中[(String,Int)],但如果名称已经存在,则会改变年龄。 我该怎么做?

从技术上讲,这不是作业,因为这与我给出的问题完全不同,但是因为它会帮助我理解我已经给出的问题,然后我会把h / w标签放在上面

1 个答案:

答案 0 :(得分:3)

如果我理解你的问题,你需要一个函数,它需要(String,Int)[(String,Int)]以及

  • 如果名称已包含在列表中,则只需更新年龄
  • 否则,请将名称附加到列表中。

我们在这里使用递归。列表的每个元素都通过一种过滤器传递,过滤器检查列表中每个元素的名称是否相等,直到它相等或者我们到达列表的末尾。在第一种情况下,年龄被更改,列表的其余部分附加到它,在第二种情况下,我们将新元素附加到列表:

-- This is a type signature. If you don't know what this is, just skip it.
alterList :: (String,Int) -> [(String,Int)] -> [(String,Int)]

alterList record [] = [record] -- If the list is empty, add our name

alterList record@(name,age) (x@(name',_):xs)
 | name == name' = record : xs      -- If the naame exists, alter and we're done
 | otherwise    = x : alterList record xs -- If not, iterate

但是,如果要将这些数据表示为列表,则将其表示为唯一的好处。通常,您可能希望使用Map。它为键值数据提供了良好的支持,具有出色的性能和共享修改后的组件。