views:

152

answers:

3

Hello to all, i have a list of tuple like this

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

I need to search the value based on username. I have using lookup but i need to change the value of the integer and write back to file. My logic of this is to delete the tuple and insert another new tuple value rather than change it.

Any idea how to do this ?

Thanks.

A: 

If you use the Data.Map type you can use functions like

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

With the way you give your list, you have to construct the map by something like

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

Finally, you can get things back to a list of values by using Data.Map.toList.

Mikael Vejdemo-Johansson
+9  A: 

Use Data.Map like this :

import qualified Data.Map as Map

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

Let's replace 54 by 78 (on "df"):

m2 = Map.insert "df" 78 m1

You can use insertWith' to combine the old and new values with a function.

Here we insert 4 on "username", and 4 is added to whatever value "username" points to.

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

If you're sure that a key is in the map, you can access its value using the (!) operator :

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

Which gives 127. But beware, it could raise an exception if the key isn't in the map!

For safe lookup :

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

There is a typo on the key, so this returns Nothing.

jdsc
+1  A: 
repList old new xs = map (\v@(x,y) -> if x == old then (new,y) else v) xs
sclv