2010-06-21 83 views
7

的哈斯克尔名单我有这样的元组的列表:元组搜索

[("username", 123), ("df", 54), ("as",2 34)] 

我需要搜索基于用户名的值。我使用查找,但我需要更改整数的值并写回文件。我的逻辑是删除元组并插入另一个新的元组值,而不是改变它。

任何想法如何做到这一点?

回答

14

使用Data.Map这样的:

import qualified Data.Map as Map 

m1 :: Map String Int 
m1 = Map.fromList [("username", 123), ("df", 54), ("as",234)] 

让我们通过78取代54(上 “DF”):

m2 = Map.insert "df" 78 m1 

您可以使用insertWith”新老并结合值与一个函数。

这里我们在“用户名”中插入4,并将4添加到“用户名”指向的任何值。 (!)

m3 = Map.insertWith (+) "username" 4 m1 

如果你确定一个关键是在地图上,你可以使用操作员访问其值:

import Data.Map ((!)) 
m3 ! "username" 

其中给出127。但要小心,如果密钥不在地图中,它可能会引发异常!

为了安全查找:

Map.lookup :: Map k a -> k -> Maybe a 
Map.lookup "usrname" m3 

有键上的错字,所以这将返回Nothing

0

如果使用Data.Map类型可以使用的功能,如

updatedMap = Data.Map.updateWithKey (\_ _ -> Just 234) "username" myMap 

有了你给你的列表的方式,你的东西来构建地图状

myMap = Data.Map.fromList (map (\ (a,b) -> (b,a)) datalist) 

最后,您可以使用Data.Map.toList将事物返回到值列表。