cabeza y cola llamadas en lista vacía trayendo una excepción
-
30-09-2019 - |
Pregunta
Estoy siguiendo un tutorial. (Real World Haskell)
Y tengo una pregunta para principiantes sobre la cabeza y la cola llamada en las listas vacías:. En GHCi se devuelve una excepción
Intuitivamente creo que diría que ambos deben devolver una lista vacía. ¿Me puede corregir? Por qué no ? (Por lo que yo recuerdo en OzML izquierdo o derecho de un vacío devuelve lista nil)
seguramente todavía no he tratado este tema en el tutorial, pero ¿no es cierto en una fuente de errores (si es proporcionar ningún argumento)? Quiero decir que si alguna vez pasa a una función de una lista de argumentos que pueden ser optionnal, leyéndolos con la cabeza puede llevar a un error?
Sólo sé el comportamiento GHCi, no sé lo que pasa cuando se compila.
Solución
Intuitivamente creo que diría que ambos deben devolver una lista vacía. ¿Me puede corregir? ¿Por qué no?
Bien - head
es [a] -> a
. Se devuelve el primer elemento único,; ninguna lista.
Y cuando no hay un primer elemento, como en una lista vacía? Así lo volver? No se puede crear un valor de tipo a
de la nada, así que todo lo que queda es undefined
- un error.
Y tail
? Cola básicamente es una lista sin su primer elemento - es decir, el punto primero más corta que la original. No se puede mantener estos leyes cuando no hay un primer elemento.
Cuando se toma una manzana de una caja, que puede no tener el mismo cuadro (lo que ocurrió cuando tail [] == []
). El comportamiento tiene que ser undefined
también.
Esto lleva a la siguiente conclusión:
seguramente todavía no he tratado este tema en el tutorial, pero ¿no es cierto en una fuente de errores? Quiero decir que si alguna vez pasa a una función de una lista de argumentos que pueden ser optionnal, leyéndolos con la cabeza puede llevar a un error?
Sí, es una fuente de errores, pero debido a que permite escribir código defectuoso. El código que está básicamente tratando de leer un valor que no existe. Por lo tanto:. * No lo utilices cabeza / cola ** - Uso coincidencia de patrones
sum [] = 0
sum (x:xs) = x + sum xs
El compilador puede garantía de que todos los casos posibles están cubiertos, los valores se define siempre y es mucho más limpio para leer.