2012-04-12 85 views
14

¿Hay alguna función incorporada para reemplazar un elemento en un índice dado en haskell?Haskell reemplazar elemento en la lista

Ejemplo:

replaceAtIndex(2,"foo",["bar","bar","bar"])

debe dar:

["bar", "bar", "foo"] 

sé que podría hacer mi propia función, pero parece que debería estar integrada.

Respuesta

9

Hay matrices reales, pero las listas son realmente únicas y la noción de reemplazar un elemento no es tan obvia (y el acceso a un elemento en un índice dado puede indicar que no se debe usar una lista, se evitan las operaciones que podrían alentarlo).

11

Por lo que sé (y puedo encontrar) no existe por defecto. Sin embargo, existe splitAt en Data.List así:

replaceAtIndex n item ls = a ++ (item:b) where (a, (_:b)) = splitAt n ls 

Esto es O (N) sin embargo. Si te encuentras haciendo esto mucho, mira otro tipo de datos como array.

+6

No es 'O (n)' en general, pero 'O (i)', donde 'i' es el índice dividido (porque solo se debe copiar el prefijo). Si ese índice es constante, la operación es 'O (1)'. –

+3

Siempre es una buena idea incluir una firma de tipo: 'replaceAtIndex :: Int -> a -> [a] -> [a]' –

29

Si necesita actualizar elementos en un índice específico, las listas no son la mejor estructura de datos para eso. Es posible que desee considerar el uso de Seq en el Data.Sequence en su lugar, en cuyo caso la función que está buscando es update :: Int -> a -> Seq a -> Seq a.

> import Data.Sequence 
> update 2 "foo" $ fromList ["bar", "bar", "bar"] 
fromList ["bar","bar","foo"] 
+0

Esto parece ser exactamente lo que necesito. ¡Gracias! –

+0

He hecho esto. Ahora, ¿cómo cambio la Seq a a a? –

+0

@ MickaelBergeronNéron puedes obtener '[a]' de 'Seq a' con' Data.Foldable.foldr (:) [] '. Si tiene una operación 'f :: a -> a -> a', puede llamar a' Data.Foldable.foldr f' con algún elemento inicial (como 0), para obtener el valor 'a' combinado. –

Cuestiones relacionadas