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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top