3 votes

Différents résultats dans la GHCI

En exécutant ceci avec M 1 affichera une nouvelle ligne et a affichera les caractères " \n " dans la sortie ghci. Comme il s'agit des mêmes caractères, je m'attendrais au même comportement.

Une raison pour laquelle ?

data V = M Int
instance Show V where
  show m = a

a :: [Char]
a = "\n"

7voto

bradrn Points 3846

Chaque fois qu'une valeur est affichée dans GHCi, celui-ci utilise l'attribut Show de cet objet pour le convertir en texte lisible par l'homme en appliquant la méthode show puis d'imprimer le résultat de la fonction String . Dans votre cas, ce qui se passe est :

  • Vous avez défini le Show exemple de V pour être une constante "\n" ou une nouvelle ligne. Ainsi, lorsque GHCi essaie d'afficher une valeur de type V il produit une nouvelle ligne.
  • En revanche, le Show exemple de String est défini de telle sorte que pour toute chaîne de caractères s , show s produira la représentation Haskell de s . Par exemple, show "\n" donnera un résultat de "\"\\n\" (c'est-à-dire guillemets, barre oblique inversée, n entre guillemets). (Essayez d'exécuter show "myString" dans GHCi et voir le résultat pour différentes chaînes de caractères pour avoir une idée de comment cela fonctionne). Ainsi, lorsque GHCi affiche un String il prend la chaîne de caractères (une nouvelle ligne, dans votre cas), la convertit en un format lisible par l'homme avec des caractères d'échappement à l'aide de la fonction show et affiche ensuite cette nouvelle chaîne.

Pourquoi est-ce que show mis en œuvre de cette manière alambiquée pour les chaînes de caractères ? Je ne suis pas tout à fait sûr, mais une possibilité est la désambiguïsation : show 1 es "1" mais show "1" es "\"1\"" . Lorsqu'il est imprimé dans la console, le premier est clairement un nombre, tandis que le second est clairement une chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X