¿Cuál es la forma más rápida de obtener el último elemento de una lista en Haskell? También en la siguiente iteración, quiero eliminar el primer y el último elemento de la lista. ¿Cuál es la forma más elegante de hacerlo? Estoy intentando la comprensión de la lista, ¡pero eso no parece muy eficiente!La forma más rápida de obtener el último elemento de una lista en Haskell
Respuesta
last
y init
harán bien el trabajo por una sola vez. Sin embargo, ambos son O (n), por lo que si necesita manipular ambos extremos de una lista a menudo, como parece implicar, puede considerar usar Data.Sequence
, que admite O (1) inserción y eliminación de artículos en ambos extremos.
Puede usar the last
function para obtener el último elemento de una lista.
En cuanto a cómo eliminar los elementos primero y último, puede usar (init . tail)
, pero no sé cuán eficiente es eso.
Creo que esta imagen de Learn You A Haskell muestra las funciones de lista bastante bien:
¿No es '(init. Tail)' incorrecto/erróneo? Debería ser '(head. Tail)'. – nulvinge
@nulvinge (head. Tail) simplemente devolvería el segundo elemento en la lista. Ver la imagen de arriba :) – Phyx
Ops, lo siento, tienes razón. Estado haciendo mucho esquema últimamente para reconocer. como composición ... – nulvinge
Para eliminar primera y última:
take (len(l)-2) (drop 1 l)
o tal vez
init (drop 1 l)
Esto también da como resultado un código casi óptimo.
Voy a publicar la aplicación Preludio ya que no se ha publicado aún:
listLast :: [a] -> a
listLast [x] = x --base case is when there's just one element remaining
listLast (_:xs) = listLast xs --if there's anything in the head, continue until there's one element left
listLast [] = error "Can't do last of an empty list!"
Tenga en cuenta que he cambiado el nombre de la función a listLast
de manera que se pueda ejecutar sin entrar en conflicto con el preludio normal. Podría, por supuesto, hacer import Prelude hiding(last)
.
La convención que usa en este http://learnyouahaskell.com/chapters es 'last'' – CSharper
(head.reverse) [1..100]
Es una alternativa al last
para obtener el último elemento.
drop 1 (take (length [1..100] - 1) [1..100])
elimina el elemento de lista primero y el último. La fuente para drop
y take
parece que podría ser más rápido que (init . tail)
.
(reverse.drop 1) ((reverse.drop 1) [1..100])
es otra variante. Pero creo que es más lento debido a la doble inversión.
' length' rara vez es algo que desea hacer sin una buena razón. No hay una buena razón aquí. Lo mismo ocurre con 'reverse'. – dfeuer
Esta respuesta se enfoca en tratar condiciones extrañas (como listas vacías) de una manera máximamente flexible, y en crear funciones más grandes desde las más pequeñas usando algunas funciones de la biblioteca. Es no la mejor respuesta para alguien que primero conoce las listas, pero un par de pasos más allá de eso.
Para lo siguiente, necesitará
import Control.Monad ((>=>))
y tendrá que usar ya sea GHC 7.10 e importar Data.List (uncons)
o definir
uncons :: [a] -> Maybe (a, [a])
uncons [] = Nothing
uncons (x:xs) = Just (x,xs)
Se puede escribir una forma segura de init
así:
init' :: [x] -> Maybe [x]
init' = foldr go Nothing
where
go x mxs = Just (maybe [] (x:) mxs)
Una versión de tail
puede escribirse
tail' :: [a] -> Maybe [a]
tail' = fmap snd . uncons
Así entonces se puede obtener un tal vez
trim' :: [a] -> Maybe [a]
trim' = init' >=> tail'
El >=>
es una especie de composición monádica hacia atrás. init' >=> tail'
es una función que aplica init'
a su argumento para obtener un Maybe [a]
. Si obtiene Nothing
, lo devuelve. Si obtiene Just xs
, aplica tail'
a xs
y lo devuelve.
partir de esto, usted puede hacer fácilmente un condensador de ajuste que recorta las listas con 0, 1 ó 2 elementos a listas vacías:
trim :: [a] -> [a]
trim = maybe [] id . trim'
- 1. PHP: ¿Cuál es la forma más rápida y fácil de obtener el último elemento de una matriz?
- 2. La forma más rápida de unificar una lista en Python
- 3. La forma más rápida de buscar una lista en python
- 4. ¿Forma más rápida de obtener múltiples FileInfo?
- 5. La forma más rápida de obtener el icono de shell
- 6. Java obtener el último elemento de una colección
- 7. Forma más rápida de obtener el tipo de contenido
- 8. Django, ¿Cuál es la mejor y más rápida manera de obtener solo el primer y último elemento de algo, Customer.objects.xxxx
- 9. ¿Cómo verificar el último elemento de una lista de Python?
- 10. búsqueda rápida para el último elemento en un Django QuerySet?
- 11. ¿Cuál es la forma más rápida de obtener un elemento dom?
- 12. Obtener el último elemento de la tubería en powershell
- 13. La forma más rápida de reposicionar la sublista en python
- 14. Obtiene el último elemento en la lista de arrays
- 15. La forma más rápida de convertir un iterador en una lista
- 16. ¿Puedes crear más de un elemento de una lista a la vez con una lista de comprensión en haskell?
- 17. ¿Cómo obtener el último elemento de una matriz en Ruby?
- 18. La forma más rápida de empaquetar una lista de flotantes en bytes en python
- 19. usando PARSENAME para buscar el último elemento en una lista
- 20. jQuery ordenable: sin arrastrar el último elemento de la lista
- 21. reforma de datos (una forma más rápida)
- 22. La forma más rápida de obtener un carácter dentro de una cadena dado el índice (PHP)
- 23. C++: La forma más rápida de ordenar una lista de números y su índice
- 24. La forma más rápida de obtener el máximo valor de un Rango exclusivo en ruby
- 25. Consultar último elemento de cada lista
- 26. ¿La forma más rápida de copiar una tabla en mysql?
- 27. La forma más rápida de iterar array en PHP
- 28. ¿Hay alguna forma de seleccionar el último elemento de una lista con CSS?
- 29. Forma más rápida de leer el archivo
- 30. ¿Cómo eliminar el primer y último elemento de una lista?
Creo que la recuperación de la última * * elemento de manera eficiente es difícil. Tal vez deberías explicar el contexto con más detalle, para que puedas ver si hay otras estructuras de datos que se ajusten mejor a tus necesidades. – phimuemue
hay pocas razones para dudar de que Prelude.last tenga una buena implementación. La mejor pregunta, como dice phimuemue, es si, si estás usando 'last' mucho, no necesitas otra cosa que listas, p. Data.Sequence o algo por el estilo. – applicative