Comment puis-je définir correctement une chaîne vide en haskell?
Je vais avoir un problème avec mon programme et j'ai été capable d'isoler le problème. J'ai réussi à le réduire à ce simple problème. Disons que j'ai la fonction
fn:: String -> String
fn (x:xs)
| null (x:xs) = "empty"
| otherwise = "hello"
De taper dans des trucs aléatoires retourne "hello"
mais si je le fais,
fn ""
- Je obtenir le non-exhaustive modèle d'erreur. Depuis "" est supposé être une liste vide, []
, il ne devrait pas correspondre à mon premier modèle et le retour "empty"
?
OriginalL'auteur bella | 2012-07-14
Vous devez vous connecter pour publier un commentaire.
Un
String
en Haskell est une liste de caractères. Afin de faire correspondre le videString
vous avez besoin pour correspondre à une liste vide ([]
). Votre modèle(x:xs)
ne fait correspondre les listes ou lesString
s avec au moins un élément car il est constitué d'un seul élément (x
) et le reste (xs
), qui peut être vide ou non vide.Une version de travail de votre fonction devrait ressembler à ceci:
Ce sera le retour de
"empty"
pourfn ""
.Bien sûr, le vide littéral de chaîne
""
peut également être utilisé dans des modèles, cette fonction peut être écritefn "" = "empty"; fn _ = "hello"
.OriginalL'auteur Simeon Visser
Votre fonction
serait mieux écrit que:
ou
Depuis
null (x:xs)
est certainement erroné (toujours Faux).Je préfère le dernier, puisqu'il fait clair, on ne s'intéressent qu'aux types de chaînes.
C'est un peu bizarre de la fonction si. Je n'ai pas vu cela dans la pratique.
OriginalL'auteur Don Stewart