2010-06-21 12 views
7

J'ai une liste de tuples comme ceci:Haskell Liste des Tuple Recherche

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

je dois rechercher la valeur basée sur le nom d'utilisateur. J'ai utilisé la recherche, mais j'ai besoin de changer la valeur de l'entier et de réécrire dans le fichier. Ma logique de ceci est de supprimer le tuple et d'insérer une autre nouvelle valeur de tuple plutôt que de le changer.

Une idée de comment faire cela?

Répondre

14

Utilisez Data.Map comme ceci:

import qualified Data.Map as Map 

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

Remplaçons 54 par 78 (sur "df"):

m2 = Map.insert "df" 78 m1 

Vous pouvez utiliser insertWith » de combiner l'ancien et le nouveau valeurs avec une fonction.

Ici, nous insérons 4 sur "nom d'utilisateur", et 4 est ajouté à la valeur de "nom d'utilisateur".

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

Si vous êtes sûr que la clé est sur la carte, vous pouvez accéder à sa valeur à l'aide de l'opérateur (!):

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

Ce qui donne 127. Mais attention, il pourrait lever une exception si la clé n'est pas sur la carte!

pour la recherche en sécurité:

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

Il y a une faute de frappe sur la clé, donc ce retour Nothing.

0

Si vous utilisez le type de Data.Map vous pouvez utiliser des fonctions telles que

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

Avec la façon dont vous donnez votre liste, vous devez construire la carte par quelque chose comme

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

Enfin, vous pouvez revenir à une liste de valeurs en utilisant Data.Map.toList.