2010-09-06 4 views
5

Каков наилучший способ определения родных символов новой строки, таких как '\ n' или '\ r \ n' в Haskell?Собственные символы новой строки?

Я вижу, что в GHC.IO:Handle есть функция «nativeNewline», но предположим, что это как частный API, так и больше всего нестандартный Haskell.

ответ

9

Вы должны думать о представлении новой строки как части кодирования текстового файла, который хранится в файловой системе, как UTF-8. Текстовый файл обычно декодируется, когда вы читаете его в своей программе и кодируете при записи - преобразование в и из собственного представления новой строки выполняется как часть этой кодировки и декодирования. Внутри вашей программы Haskell, так же, как символы представлены их кодовыми точками Unicode, символ новой строки всегда \n.

Чтобы сообщить системе ввода/вывода о кодировке новой строки, которую вы хотите использовать, см. Раздел в разделе Newline Conversion в документации для System.IO.

+0

Итак, если бы я сгенерировал файл в памяти (как, например, Data.Text), я должен использовать «\ n» в любом случае даже в Windows? – LennyStackOverflow

+4

Да. Перевод в '\ r \ n' произойдет, когда вы напишете текст в файл. –

+0

Хорошо, спасибо Саймон. – LennyStackOverflow

2

System.IO.nativeNewline не является частным - вы можете получить доступ к этому , чтобы выяснить, что GHC считает родной «перевод строки», чтобы быть на текущей платформе.

Обратите внимание, что тип этой переменной, System.IO.Newline, имеет , не имеет экземпляра Show с GHC 6.12.3. Таким образом, вы не можете легко распечатать его значение. Вместо этого проверьте, равно ли оно по System.IO.LF или System.IO.CRLF.

Однако, как Саймон отметил, вы должны не нужно знать о нативной последовательности новой строки с нормальным использованием текста-ориентированных функций ввода-вывода в GHC.

Эта переменная вместе с остальными функциями Unicode системы ввода-вывода еще не является частью стандарта Haskell. Он не был включен в Haskell 2010 report. Однако, поскольку он уже реализован в GHC, и существует довольно широкое мнение о том, что это важно и полезно, ожидайте, что он будет включен в один из предстоящих ежегодных пересмотров стандарта.

+0

Спасибо за ответ. Мой код чист и, следовательно, не о IO. Как вы решаете это в Data.Text? – LennyStackOverflow

+1

Константа 'nativeNewline' не находится в монаде IO, поэтому вы можете использовать ее в чистом коде. Он просто находится в модуле с именем «System.IO», потому что он обычно используется в контексте чтения и записи текста в файл или видимое пользователем устройство. На самом деле, я не уверен, почему вам нужно знать о родной последовательности строк, если вы не обмениваетесь текстовой информацией с внешним миром. – Yitz

+0

Чтобы сделать его конкретным: я создаю файлы LateX в памяти с помощью Data.Text. Я не уверен, как отделить линии. Должен ли я использовать жестко закодированные «\ n»? Я не знаю, что произойдет с файлами в памяти, независимо от того, записано ли оно в файл, отображается ли на экране или только подсчитанные строки. Из ответа Саймона у меня сложилось впечатление, что я могу использовать жестко закодированные «\ n», и IO Haskell автоматически преобразует его в «\ r \ n» в Windows. – LennyStackOverflow

Смежные вопросы