2010-09-06 12 views
5

Qual è il modo migliore per determinare i caratteri di nuova riga nativi come "\ n" o "\ r \ n" in Haskell?Caratteri newline nativi?

Vedo che c'è una funzione "nativeNewline" in GHC.IO:Handle, ma supponiamo che sia sia un'API privata che soprattutto Haskell non standard.

risposta

9

Si dovrebbe pensare alla rappresentazione di nuova riga come parte della codifica di un file di testo che è archiviato nel filesystem, proprio come UTF-8. Un file di testo viene normalmente decodificato quando lo si legge nel programma e viene codificato quando viene scritto: la conversione da e verso la rappresentazione newline nativa viene eseguita come parte di questa codifica e decodifica. All'interno del tuo programma Haskell, proprio come i caratteri sono rappresentati dai loro punti di codice Unicode, il carattere di nuova riga è sempre \n.

Per comunicare al sistema di I/O la codifica di nuova riga che si desidera utilizzare, consultare la sezione su Newline Conversion nella documentazione per System.IO.

+0

Quindi se dovessi generare un file in memoria (come dice Data.Text), dovrei usare '\ n' in ogni caso, anche su Windows? – LennyStackOverflow

+4

Sì. La traduzione in '\ r \ n' avverrà quando scrivi il testo nel file. –

+0

Ok, grazie Simon. – LennyStackOverflow

2

System.IO.nativeNewline non è privata - è possibile accedere per scoprire cosa GHC considera la "nuova linea" nativo di essere sulla piattaforma corrente.

Si noti che il tipo di questa variabile, System.IO.Newline, non ha non ha un'istanza Show a partire da GHC 6.12.3. Quindi non è possibile stampare facilmente il suo valore. Invece, controlla se è uguale a a System.IO.LF o System.IO.CRLF.

Tuttavia, come Simon ha sottolineato, non si dovrebbe avere bisogno di di conoscere la sequenza di ritorno a capo nativa con il normale utilizzo delle funzioni IO orientata al testo in GHC.

Questa variabile, insieme al resto delle nuove capacità di con riconoscimento Unicode del sistema IO, non fa ancora parte dello standard Haskell. Non è stato incluso nello Haskell 2010 report. Tuttavia, poiché è già implementato in GHC, e vi è un consenso abbastanza diffuso sul fatto che sia importante e utile, si aspetta che venga incluso in una delle revisioni annuali dello standard in uscita.

+0

Grazie per la risposta. Il mio codice è puro e quindi non riguarda IO. Come lo risolveresti in Data.Text? – LennyStackOverflow

+1

La costante 'nativeNewline' non è nella monade IO, quindi puoi usarla in puro codice. Capita di trovarsi in un modulo il cui nome è "' System.IO' ", perché viene normalmente utilizzato nel contesto della lettura e scrittura di testo in un file o in un dispositivo visibile all'utente. In effetti, non sono sicuro del motivo per cui è necessario conoscere la sequenza newline nativa se non si scambiano informazioni testuali con il mondo esterno. – Yitz

+0

Per renderlo concreto: sto generando file LateX in memoria con Data.Text. Non sono sicuro di come separare le linee. Dovrei usare hard-coded '\ n'? Non so cosa succederà con i file in memoria, sia che siano scritti su un file, visualizzati sullo schermo o semplicemente contati. Dalla risposta di Simon ho l'impressione, posso usare hard-coded '\ n' e l'I/O di Haskell lo convertirò automagicamente in \ r \ n 'su Windows. – LennyStackOverflow