web-dev-qa-db-fra.com

Que signifie une esperluette échappée à Haskell?

J'ai regardé le rapport Haskell 201 et j'ai remarqué une séquence d'échappement étrange avec une esperluette: \&. Je n'ai pas pu trouver d'explication sur ce que devait représenter cette séquence d'échappement. Il peut également ne se trouver que dans des chaînes. J'ai essayé print "\&" dans GHCi, et il imprime une chaîne vide.

36
Nolan

Ça s'échappe ... pas de personnage. Il est utile de "casser" certaines séquences d'échappement. Par exemple, nous pourrions vouloir exprimer "\12" ++ "3" comme un littéral de chaîne unique. Si nous essayons l'approche évidente, nous obtenons

"\123" ==> "{"

On peut cependant utiliser

"\12\&3"

pour le résultat souhaité.

Aussi, "\SOH" et "\SO" sont tous deux valides simples ASCII caractère s'échappe, faisant "\SO" ++ "H" difficile à exprimer en un seul littéral: nous avons besoin de "\SO\&H" pour ça.

Cette astuce d'échappement est également exploitée par la norme Show String instance, qui doit produire une syntaxe littérale valide. Nous pouvons le voir en action dans GHCi:

> "\140" ++ "0"
"\140\&0"
> "\SO" ++ "H"
"\SO\&H"

De plus, cela aide grandement les programmes externes qui visent à générer du code Haskell (par exemple pour la métaprogrammation). Lors de l'émission de caractères pour un littéral de chaîne, le programme externe peut ajouter \& à la fin des échappées potentiellement ambiguës (ou même de toutes les échappées) afin que le programme n'ait pas à gérer les interactions indésirables. Par exemple. si le programme veut émettre \12 maintenant, il peut émettre \12\& et être libre d'émettre n'importe quoi comme personnage suivant. Sinon, le programme doit se rappeler que, lorsque le caractère suivant est émis, il doit être ajouté par \& s'il s'agit d'un chiffre. Il est plus simple de toujours ajouter \&, même si ce n'est pas nécessaire: \12\&A est légal et a la même signification que \12A.

Enfin, une citation du rapport Haskell, expliquant \&:

2.6 Littéraux de caractères et de chaînes

[...]

Conformément à la règle du "grignotage maximal", les caractères d'échappement numériques dans les chaînes se composent de tous les chiffres consécutifs et peuvent être de longueur arbitraire. De même, celui ambigu ASCII code d'échappement, "\SOH", est analysé comme une chaîne de longueur 1. Le caractère d'échappement \& est fourni en tant que "null character" pour autoriser les chaînes telles que "\137\&9" et "\SO\&H" à construire (tous deux de longueur deux). Donc "\&" est équivalent à "" et le caractère '\&' n'est pas autorisé. D'autres équivalences de caractères sont définies à la section 6.1.2.

43
chi