Data.ByteString.Char8
предоставляет функции для обработки значений ByteString
как последовательностей 8-битных символов ASCII, в то время как Data.Text
является независимым типом, поддерживающим весь Юникод.
ByteString
и Text
, по сути, одинаковы в отношении представления - строгие распакованные массивы с отложенными вариантами, основанные на списках строгих блоков. Основное отличие состоит в том, что ByteString
хранит октеты (то есть Word8
с), тогда как Text
хранит Char
с, закодированные в UTF-16.
Если вы работаете с текстом только для ASCII, то использование Data.ByteString.Char8
, вероятно, будет быстрее, чем Text
, и будет использовать меньше памяти; однако вы должны спросить себя, действительно ли вы уверены, что когда-либо будете работать только с ASCII. По сути, в 99% случаев использование Data.ByteString.Char8
сверх Text
является хаком скорости - октеты не являются символами, и любой Хаскеллер может согласиться с тем, что использование правильного типа должно иметь приоритет над сырой, голой скоростью металла. Обычно вы должны учитывать это, только если вы профилировали программу, и это узкое место. Text
хорошо оптимизировано, и в большинстве случаев разница, вероятно, будет незначительной.
Конечно, есть ситуации, не связанные со скоростью, в которых Data.ByteString.Char8
оправдано. Рассмотрим файл, содержащий данные, которые по сути являются двоичными, а не текстовыми, но разделены на строки; использование lines
вполне разумно. Кроме того, вполне возможно, что целое число может быть закодировано в десятичном формате ASCII в контексте двоичного формата; использование readInt
в этом случае имело бы смысл.
Итак, в основном:
Data.ByteString.Char8
: Для ситуаций чистого ASCII, где производительность имеет первостепенное значение, и для обработки «почти двоичных» данных, содержащих некоторые компоненты ASCII.
Data.Text
: текст, включая любую ситуацию, когда существует малейшая вероятность использования чего-либо, кроме ASCII.