2010-09-06 17 views
5

¿Cuál es la mejor forma de determinar los caracteres nativos de nueva línea como '\ n' o '\ r \ n' en Haskell?Caracteres nativos de línea nueva?

Veo que hay una función "nativeNewline" en GHC.IO:Handle, pero supongamos que es una API privada y, sobre todo, Haskell no estándar.

Respuesta

9

Debería pensar en la representación de nueva línea como parte de la codificación de un archivo de texto que está almacenado en el sistema de archivos, al igual que UTF-8. Normalmente, un archivo de texto se decodifica cuando lo lee en su programa y se codifica cuando se escribe: la conversión hacia y desde la representación de nueva línea nativa se realiza como parte de esta codificación y decodificación. Dentro de su programa Haskell, así como los caracteres están representados por sus puntos de código Unicode, el carácter de nueva línea es siempre \n.

Para indicarle al sistema de E/S sobre la nueva codificación que desea utilizar, consulte la sección Newline Conversion en la documentación de System.IO.

+0

Entonces, si generase un archivo en la memoria (como por ejemplo, Data.Text), debería usar '\ n' en cualquier caso, incluso en Windows? – LennyStackOverflow

+4

Sí. La traducción a '\ r \ n' sucederá cuando escriba el texto en el archivo. –

+0

Ok, gracias Simon. – LennyStackOverflow

2

System.IO.nativeNewline no es privado - se puede acceder a él para averiguar qué GHC considera la "nueva línea" nativo para ser en la plataforma actual.

Tenga en cuenta que el tipo de esta variable, System.IO.Newline, no tiene una instancia Show a partir de GHC 6.12.3. Por lo tanto, no puede imprimir fácilmente su valor. En su lugar, verifique si es igual a a System.IO.LF o System.IO.CRLF.

Sin embargo, como se señaló Simon, no debe necesitar saber acerca de la secuencia de nueva línea materna con el uso normal de las funciones IO orientados a texto en GHC.

Esta variable, junto con el resto de las nuevas capacidades con reconocimiento de Unicode del sistema IO, aún no es parte del estándar Haskell. No se incluyó en Haskell 2010 report. Sin embargo, dado que ya está implementado en GHC, y existe un amplio consenso de que es importante y útil, se espera que se incluya en una de las próximas revisiones anuales de la norma .

+0

Gracias por la respuesta. Mi código es puro y, por lo tanto, no se trata de IO. ¿Cómo resolverías eso dentro de Data.Text? – LennyStackOverflow

+1

La constante 'nativeNewline' no está en la mónada IO, por lo que puede usarla en código puro. Simplemente sucede que se ubica en un módulo cuyo nombre es "' System.IO' ", porque normalmente se usa en el contexto de lectura y escritura de texto en un archivo o dispositivo visible por el usuario. De hecho, no estoy seguro de por qué necesita saber sobre la secuencia newline nativa si no está intercambiando información textual con el mundo exterior. – Yitz

+0

Para hacerlo más concreto: estoy generando archivos LateX en la memoria con Data.Text. No estoy seguro de cómo separar las líneas. ¿Debo usar '\ n' codificado? No sé qué va a pasar con los archivos en la memoria, ya sea que estén escritos en un archivo, que se muestren en la pantalla o que solo se cuenten las líneas. De la respuesta de Simon tengo la impresión de que puedo usar '\ n' codificado y el IO de Haskell lo convertirá automágicamente en '\ r \ n' en Windows. – LennyStackOverflow

Cuestiones relacionadas