Подтвердить что ты не робот

Data.Text vs Data.ByteString.Char8

Может ли кто-либо объяснить плюсы и минусы использования типов данных Data.Text и Data.ByteString.Char8? Работает ли с текстом ASCII только эти плюсы и минусы? Разве их ленивые варианты меняют историю?

4b9b3361

Ответ 1

Data.ByteString.Char8 предоставляет функции для обработки значений ByteString в качестве последовательностей 8-разрядных символов ASCII, а Data.Text - независимый тип, поддерживающий всю Юникод.

ByteString и Text по существу одинаковы, поскольку представление - строгие, распакованные массивы с ленивыми вариантами на основе списков строгих фрагментов. Основное отличие состоит в том, что ByteString хранит октеты (т.е. Word8 s), а Text хранит Char s, закодированные в UTF-16.

Если вы работаете с текстом только ASCII, то с помощью Data.ByteString.Char8, вероятно, будет быстрее, чем Text, и используйте меньше памяти; однако, вы должны спросить себя, действительно ли вы уверены, что только собираетесь работать с ASCII. В основном, в 99% случаев использование Data.ByteString.Char8 over Text - это хакеры скорости - октеты не являются символами, и любой Haskeller может согласиться с тем, что использование правильного типа должно быть приоритетным по сравнению с необработанной скоростью без гола. Обычно вы должны учитывать это только в том случае, если вы профилировали программу и это узкое место. Text хорошо оптимизирован, и в большинстве случаев разница будет незначительной.

Конечно, существуют ситуации, не связанные с скоростью, в которых Data.ByteString.Char8 является оправданным. Рассмотрим файл, содержащий данные, которые по существу являются двоичными, а не текстовыми, но разделяются на строки; использование lines вполне разумно. Кроме того, вполне возможно, что целое число может быть закодировано в ASCII десятичном значении в контексте двоичного формата; используя readInt, будет иметь смысл в этом случае.

Итак, в основном:

  • Data.ByteString.Char8: для чистых ситуаций ASCII, где производительность имеет первостепенное значение, и для обработки "почти двоичных" данных с некоторыми компонентами ASCII.
  • Data.Text: Текст, включая любую ситуацию, где имеется малейшая возможность использования чего-то другого, кроме ASCII.