2010-06-21 60 views
7

Tengo una lista de tuplas como esto:Haskell Lista de Tupla Buscar

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

tengo que buscar el valor basado en nombre de usuario. Tengo el uso de la búsqueda, pero necesito cambiar el valor del entero y volver a escribir en el archivo. Mi lógica de esto es eliminar la tupla e insertar otro nuevo valor de tupla en lugar de cambiarlo.

¿Alguna idea de cómo hacer esto?

Respuesta

14

Uso Data.Map así:

import qualified Data.Map as Map 

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

Vamos a sustituir 54 por 78 (el "DF"):

m2 = Map.insert "df" 78 m1 

Usted puede utilizar insertWith' combinar lo viejo y nuevo valores con una función.

Aquí insertamos 4 en "nombre de usuario", y 4 se agrega a cualquier valor que señale el "nombre de usuario".

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

Si está seguro de que la clave está en el mapa, puede acceder a su valor usando el operador (!):

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

que da 127. ¡Pero cuidado, podría generar una excepción si la clave no está en el mapa!

para la búsqueda segura:

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

Hay un error tipográfico en la llave, por lo que este vuelve Nothing.

0

Si se utiliza el tipo Data.Map puede utilizar funciones como

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

Con la forma en que usted da su lista, usted tiene que construir el mapa por algo así como

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

Por último, puede hacer que las cosas vuelvan a una lista de valores utilizando Data.Map.toList.

Cuestiones relacionadas