Question

je suis un tutoriel. (Real World Haskell)

Et j'ai une question de débutant à propos de la tête et la queue appelée sur les listes vides. Dans GHCi il retourne exception

Intuitivement, je pense que je dirais les deux doivent retourner une liste vide. Pourriez-vous me corriger? Pourquoi pas ? (Pour autant que je me souvienne en OzML gauche ou à droite d'un rendement de liste vide nil)

Je sûrement pas encore couvert ce sujet dans le tutoriel, mais isnt une source de bugs (si fournissant pas d'arguments)? Je veux dire que si jamais passer à une fonction d'une liste d'arguments qui peuvent être optionnel, les lire avec la tête peut conduire à un bug?

Je sais que le comportement GHCi, je ne sais pas ce qui se passe lors de la compilation.

Était-ce utile?

La solution

  

Intuitivement, je pense dirais qu'ils devraient tous deux retourner une liste vide. Pourriez-vous me corriger? Pourquoi pas?

Bien - head est [a] -> a. Elle retourne l'élément unique, d'une part; aucune liste.

Et quand il n'y a pas premier élément comme dans une liste vide? Eh bien quoi revenir? Vous ne pouvez pas créer une valeur de type a de rien, donc tout ce qui reste est undefined - une erreur.


Et tail? La queue est essentiellement une liste sans son premier élément - à savoir un élément plus court que celui d'origine. Vous ne pouvez pas respecter ces lois quand il n'y a pas premier élément.

Lorsque vous prenez une pomme d'une boîte, vous ne pouvez pas avoir la même boîte (ce qui est arrivé quand tail [] == []). Le comportement doit être undefined aussi.


Cela conduit à la conclusion suivante:

  

Je sûrement pas encore couvert ce sujet dans le tutoriel, mais isnt une source de bugs? Je veux dire que si jamais passer à une fonction d'une liste d'arguments qui peuvent être optionnel, les lire avec la tête peut conduire à un bug?

Oui, il est une source de bugs, mais parce qu'il permet d'écrire du code défectueux. Le code qui essaie essentiellement de lire une valeur qui n'existe pas. Donc:. * Ne jamais utiliser la tête / queue ** - Utilisez la recherche de motifs

sum     [] = 0
sum (x:xs) = x + sum xs

Le compilateur peut garantie que tous les cas possibles sont couverts, les valeurs sont toujours définies et il est beaucoup plus propre à lire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top