2010-09-06 14 views
5

Quelle est la meilleure façon de déterminer les caractères de nouvelle ligne natifs tels que '\ n' ou '\ r \ n' dans Haskell?Caractères de nouvelle ligne natifs?

Je vois qu'il existe une fonction "nativeNewline" dans GHC.IO:Handle, mais supposons qu'il s'agit à la fois d'une API privée et surtout de Haskell non standard.

Répondre

9

Vous devriez penser à la représentation de nouvelle ligne dans le cadre de l'encodage d'un fichier texte qui est stocké dans le système de fichiers, tout comme UTF-8. Un fichier texte est normalement décodé lorsque vous le lisez dans votre programme, et encodé lorsqu'il est écrit - la conversion de et vers la représentation newline native est effectuée dans le cadre de cet encodage et décodage. Dans votre programme Haskell, tout comme les caractères sont représentés par leurs points de code Unicode, le caractère de nouvelle ligne est toujours \n.

Pour indiquer au système d'E/S le codage de nouvelle ligne que vous souhaitez utiliser, reportez-vous à la section sur Newline Conversion dans la documentation de System.IO.

+0

Donc, si je devais générer un fichier en mémoire (comme par exemple Data.Text), je devrais utiliser '\ n' dans tous les cas, même sous Windows? – LennyStackOverflow

+4

Oui. La traduction en '\ r \ n' aura lieu quand vous écrivez le texte dans le fichier. –

+0

Ok, merci Simon. – LennyStackOverflow

2

System.IO.nativeNewline est pas privé - vous pouvez y accéder pour savoir ce que GHC considère la « nouvelle ligne » native d'être sur la plate-forme actuelle.

Notez que le type de cette variable, System.IO.Newline, n'a pas d'instance Show à partir de GHC 6.12.3. Donc, vous ne pouvez pas facilement imprimer sa valeur. Au lieu de cela, vérifiez pour voir si elle est égale à System.IO.LF ou System.IO.CRLF.

Cependant, comme Simon a souligné, vous ne devriez pas avoir de connaître la séquence native avec retour à la ligne d'une utilisation normale des fonctions IO orientées texte dans GHC.

Cette variable, ainsi que le reste des nouvelles fonctionnalités prenant en charge Unicode, ne font pas encore partie de la norme Haskell. Il n'était pas inclus dans le Haskell 2010 report. Cependant, comme il est déjà implémenté dans GHC, et il y a un consensus assez répandu qu'il est important et utile, attendez-vous à être inclus dans l'une des révisions annuelles à venir de la norme .

+0

Merci pour la réponse. Mon code est pur et donc pas sur IO. Comment résoudriez-vous cela dans Data.Text? – LennyStackOverflow

+1

La constante 'nativeNewline' n'est pas dans la monade IO, vous pouvez donc l'utiliser en code pur. Il se trouve simplement dans un module dont le nom est "' System.IO' ", car il est normalement utilisé dans le contexte de la lecture et de l'écriture de texte dans un fichier ou un périphérique visible par l'utilisateur. En fait, je ne suis pas sûr de savoir pourquoi vous avez besoin de connaître la séquence newline native si vous n'échangez aucune information textuelle avec le monde extérieur. – Yitz

+0

Pour le rendre plus concret: je génère des fichiers LateX en mémoire avec Data.Text. Je ne suis pas sûr de savoir comment séparer les lignes. Devrais-je utiliser un '\ n' codé en dur? Je ne sais pas ce qu'il va se passer avec les fichiers en mémoire, qu'ils soient écrits dans un fichier, affichés à l'écran ou simplement comptés. D'après la réponse de Simon, j'ai l'impression que je peux utiliser '\ n' codé en dur et que les E/S d'Haskell le convertiront automatiquement en '\ r \ n' sous Windows. – LennyStackOverflow