Comment puis-je écrire multi-chaînes en Haskell?
Disons que j'ai cette chaîne littérale avec des sauts de ligne:
file :: String
file = "the first line\nthe second line\nthe third line"
Est-il possible de l'écrire comme ça?
file :: String
file = "the first line
the second line
the third line"
La tentative juste au-dessus conduit à cette erreur:
factor.hs:58:33:
lexical error in string/character literal at character '\n'
Failed, modules loaded: none.
- À supposer qu'il y avait un moyen, ne serait-il pas ajouter un espace afin d'atteindre l'indentation?
- Voir ma réponse.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez écrire plusieurs lignes de cordes, comme si
Qui s'imprime comme
Si vous souhaitez cette option pour imprimer sur deux lignes
Qui s'imprime comme
Il y a quelques temps j'ai publié une bibliothèque nommée "neat-interpolation" pour résoudre le problème de multi-chaînes et l'interpolation à l'aide de la
QuasiQoutes
extension. Son principal avantage sur les concurrents est une gestion intelligente de l'espace, qui prend soin d'interpolation multi-chaînes. Voici un exemple de comment cela fonctionne.Exécutant la commande suivante:
produira ce (avis de la réduction de l'indentation par rapport à la façon dont il a été déclaré):
Maintenant, nous allons le tester avec multiligne paramètres de la chaîne:
Nous obtenons
Remarquez comment il parfaitement conservé les niveaux d'indentation des lignes de la variable espaces réservés étaient. La norme interpolateurs aurait foiré tous les espaces et produit quelque chose comme ce qui suit:
MultiWayIf
,LambdaCase
.)En Haskell, vous pouvez taper plusieurs lignes de cordes de terminer par une barre oblique inverse
\
et le début du retour à la ligne avec un autre\
, juste comme ça :Je ne crois pas que Haskell est un moyen facile de le faire sans recourir à quasiquoting ou quelque chose d'autre. Cependant, vous pouvez vous principalement ce que vous voulez en utilisant le unlines fonction comme ci-dessous. Toutefois, cela entraînera un retour à la ligne après la dernière ligne, que vous pouvez ou ne peuvent pas se soucier.
intercalate "\n"
au lieu deunlines
si vous ne voulez pas de fuite de saut de ligne.import Data.List
. J'imagine que l'exigence de l'importation est pourquoi je l'ai vuunlines
utilisé plus souvent que lesintercalate
.De nombreuses fois cette facality est appelé heredocs. Haskell n'a pas heredocs.
Cependant, il existe plusieurs paquets qui utilisent GHC du QuasiQuotes extensions pour atteindre cet objectif.
Ici est celui que j'utilise: http://hackage.haskell.org/package/interpolatedstring-perl6-0.9.0/docs/Text-InterpolatedString-Perl6.html
Votre exemple serait:
Quasiquotation examplete présenté dans Multi-ligne de chaînes en Haskell.
raw-cordes-qq est mon préféré pour la fin encore.