Si je compare une chaîne littérale à une chaîne littérale utilisant l'instruction de cas, je reçois le comportement attendu: si elles sont les mêmes - il correspond, si elles ne sont pas - il n'a pas .les variables correspondant à motif dans une déclaration de cas dans Haskell
Cependant, si je compare une chaîne littérale à une constante qui est une chaîne, je reçois « matches de motif se chevauchent » avertissement et la branche avec la constante correspond toujours.
Voici un exemple de session:
Prelude> let var1 = "abc"
Prelude> let var2 = "def"
Prelude> case var1 of { var2 -> "Fail"; _ -> "Win" }
<interactive>:1:0:
Warning: Pattern match(es) are overlapped
In a case alternative: _ -> ...
"Fail"
Prelude> case "abc" of { var2 -> "Fail"; _ -> "Win" }
<interactive>:1:0:
Warning: Pattern match(es) are overlapped
In a case alternative: _ -> ...
"Fail"
Prelude> case "abc" of { "def" -> "Fail"; _ -> "Win" }
"Win"
Pendant ce temps, se comporte comme prévu:
> Prelude> if var1 == var2 then "Fail" else "Win"
"Win"
Qu'est-ce qui se passe ici? Comment ce comportement a-t-il un sens?
Merci, messieurs. Vous avez expliqué à la fois ce qui se passait et comment faire correspondre une chaîne d'entrée avec des valeurs codées en dur. –
Je souhaite que la documentation et divers didacticiels expliquent explicitement que a) l'instruction case correspond à une syntaxe différente et b) autre que la similarité superficielle Le cas de Haskell n'a rien de commun avec le commutateur de C. Ils résolvent différents problèmes. –
Ceci est également bien expliqué dans le livre (gratuit) [Real World Haskell] (http://book.realworldhaskell.org/read/defining-types-streamlining-functions.html#id587485). – Flow