2010-12-04 23 views
5

Un programa que estoy escribiendo en Haskell tiene una instancia de la lista de mi tipo definido:elementos Actualizando tupla de una lista en Haskell

type Locals = [(String, Float)] 

Estoy tratando de actualizar esta lista mediante la recepción de una cadena y la actualización de la flotación correspondiente valor, pero la cadena podría no estar en la lista en ese momento.

Desde listas de Haskell son inmutables, decidí que la manera más fácil era hacer esto (en pseudocódigo):

if a tuple containing the string exists: 
    delete it 

add the correct data 

Quiero saber:

a) Si hay una manera más fácil de hacer este

b) Si no, ¿cómo hago para borrar el elemento correcto

Gracias

Respuesta

5

Parece un mapa asociativo. Yo usaría Data.Map. Esto se conoce como un "diccionario" en otros idiomas. Map.insert hace lo que necesita.

+0

No siempre es una buena idea usar 'Data.Map' en lugar de una lista de asociación. 'Data.Map' solo es más rápido para una estructura de datos grande, y con frecuencia la lista de asociaciones es más fácil de usar y da como resultado un código más limpio. Aquí no tenemos información acerca de cómo se usa la lista de asociaciones o cómo son los datos, por lo que es difícil de decir. – Yitz

+0

@Yitz, supongo que desafío su afirmación de que las listas de asociaciones son más simples y más claras "a menudo". Nunca he experimentado eso. – luqui

+0

Eso debe ser porque se llega a 'Data.Map' con demasiada frecuencia. :) – Yitz

3

parece que la mejor manera de que esto sería hacer

filter (\x -> fst x /= s) xs 

No necesito más ayuda, gracias de todos modos.

+1

Eso eliminaría _todas las entradas de 'x' (que podría ser exactamente lo que desea). Si solo quiere eliminar uno (o sabe que hay una sola coincidencia), simplemente use Data.List.deleteBy: 'deleteBy ((== s). Fst) xs'. Si usa esto, supongo que podría utilizar otras funciones en Data.List, como ['lookup'] (http://hackage.haskell.org/packages/archive/base/latest/doc /html/Data-List.html#v:lookup) y tal vez ['insert'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/Data-List.html#v :insertar). –

0

Soy un novato para Haskell. Solo por diversión.

func xs str value = (str, value) : foldr step [] xs where 
     step x acc 
      | fst x == str = acc 
      | otherwise = x:acc 
0

addToAL de Data.List.Utils hace lo que quiere.

Agrega el par especificado (clave, valor) a la lista dada, eliminando cualquier par existente con la misma clave ya presente.

Cuestiones relacionadas