/ / ¿Cómo mover 1 elemento de una lista a la derecha o izquierda en Haskell? - lista, haskell

¿Cómo mover 1 elemento de una lista a la derecha o izquierda en Haskell? - lista, haskell

Hola, he estado buscando una respuesta pero no pude encontrar una. Digamos que tenemos una lista como [1,10,4,5,3] ¿Cómo puedo desplazar 5 a la izquierda para que esta lista se convierta en [1,10,5,4,3].

lo intenté swapElementsAt Al encontrar el índice de ese elemento pero parece muy insuficiente.

Respuestas

0 para la respuesta № 1

Considera cómo escribirías esta función sidebían recorrer la lista de entrada de izquierda a derecha observando una vecindad muy local del principio de la lista (ya que eso es lo que se puede hacer con el patrón de coincidencia).

La forma más directa seríacoincida con el patrón en los dos primeros elementos, y verifique si el segundo elemento coincide con su patrón. Si es así, simplemente construya una nueva lista intercambiando estos elementos y agregando el resto de la lista; de lo contrario, repase el resto.

En codigo:

swapElem :: Eq a => a -> [a] -> [a]
swapElem e (x:y:xs) | y == e = y : x : xs
swapElem e (x:xs) = x : swapElem e xs
swapElem _ [] = []

El primer patrón solo coincide cuando hay enal menos dos elementos en la lista, y el segundo elemento es igual al deseado. Si hay menos elementos o el segundo elemento no es el correcto, caerá en el segundo patrón, que coincide con la lista arbitraria no vacía y las llamadas swapElem en el resto de la lista. El tercer patrón está ahí para proporcionar el caso de recursión base de una lista de entrada vacía.

Tenga en cuenta que este código solo cambia la primera aparición del elemento de destino:

Prelude> swapElem 5 [1, 10, 4, 5, 3]
[1,10,5,4,3]
Prelude> swapElem 5 [1, 10, 5, 4, 5, 3]
[1,5,10,4,5,3]

¿Cómo lo cambiarías para que desplace a la izquierda todo 5s?

Además, la respuesta depende de qué es exactamente tuentrada. La respuesta de @Scarabyte considera el caso en el que se le da la posición del elemento objetivo, mientras que este enfoque considera el elemento que desea desplazar a la izquierda.


1 para la respuesta № 2
swapElementsAt :: Int -> [a] -> [a]
swapElementsAt n list = let (beg, a:b:rest) = splitAt (n-1) list in beg ++ b:a:rest

Funciona como

λ> swapElementsAt 3 [1,10,4,5,3]
[1,10,5,4,3]