说我有一个列表,我希望将名称和年龄添加到表中[(String,Int)],但如果名称已经存在,则会改变年龄。 我该怎么做?
从技术上讲,这不是作业,因为这与我给出的问题完全不同,但是因为它会帮助我理解我已经给出的问题,然后我会把h / w标签放在上面
答案 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
。它为键值数据提供了良好的支持,具有出色的性能和共享修改后的组件。