2011-03-15 116 views
1

說我有一個列表,我想添加名稱和年齡[[String,Int]]到表中,但如果名稱已經存在,它會改變年齡。 我該如何去做這個?將數據添加到列表

從技術上講,這不是功課,因爲這是沒有像我一直在考慮這個問題,但它會幫助我瞭解我一直在考慮這個問題的話,我就會把H/W選項卡上

回答

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 [email protected](name,age) ([email protected](name',_):xs) 
| name == name' = record : xs  -- If the naame exists, alter and we're done 
| otherwise = x : alterList record xs -- If not, iterate 

然而,這是唯一的好來表示這樣的數據作爲一個列表,如果你想流它。通常,您可能需要使用Map。它爲關鍵值數據提供了良好的支持,並且具有出色的性能和共享修改後的組件。

+0

它給了我這個錯誤分析錯誤輸入'=' – Ahsan 2011-03-15 21:28:40

+0

@Ahsan對不起。輸入速度太快。如果您對我的功能有任何疑問,請詢問我。 – fuz 2011-03-15 21:33:05

+0

抱歉,它現在顯示此錯誤無法匹配預期類型'[(String,Int)]' 針對推斷類型'(String,Int)' 在表達式中:記錄 在alterList的定義中:alterList記錄[] =記錄 – Ahsan 2011-03-15 21:49:19