Текст или Bytestring
Добрый день.
единственное, что я сейчас ненавижу в Haskell-это количество пакетов для работы со строкой.
сначала я использовал родной Haskell [Char] строки, но когда я попытался начать использовать библиотеки hackage, то полностью потерял в бесконечных преобразованиях. Каждый пакет, кажется, использовать различные строки реализации, некоторые принимает их собственную вещь ручной работы.
далее я переписал свой код с Data.Text строки и
3 ответов:
ByteStringsв основном полезны для двоичных данных, но они также являются эффективным способом обработки текста, если все, что вам нужно, это набор символов ASCII. Если вам нужно обрабатывать строки unicode, вам нужно использоватьText. Однако я должен подчеркнуть, что ни один из них не является заменой другого, они обычно используются для разных вещей: в то время какTextпредставляет собой чистый unicode, вам все равно нужно кодировать и из двоичногоByteStringпредставление всякий раз, когда вы, например, транспортировать текст через сокет или a файл.вот хорошая статья об основах unicode, которая делает достойную работу по объяснению отношения кодовых точек unicode (
Text) и закодированные двоичные байты (ByteString):абсолютный минимум каждый разработчик программного обеспечения абсолютно, положительно должен знать о Unicode и наборах символовможно использовать данные.Текст.Кодировка модуль для преобразования между двумя типами данных, или данные.Текст.Ленивый.Кодировка если вы используйте ленивые варианты (как вы, кажется, делаете на основе ваших сообщений об ошибках).
вы определенно хотите использовать данные.Текст для текстовых данных.
encodeUtf8- это путь. Эта ошибка:не удалось сопоставить ожидаемые данные типа.ByteString.Ленивый.Внутренний.ByteString против выведенных данных типа.ByteString.Внутренний.ByteString
означает, что вы поставляете строго bytestring для кода, который ожидает лень bytestring. Преобразование легко с
fromChunksфункция:Data.ByteString.Lazy.fromChunks :: [Data.ByteString.Internal.ByteString] -> ByteStringпоэтому все, что вам нужно сделать, это добавить функцию
fromChunks [myStrictByteString]везде, где ожидается ленивый bytestring.преобразование другой путь можно выполнить с двойной функцией
toChunks, который принимает ленивый bytestring и дает список строгих кусков.вы можете спросить сопровождающих некоторых пакетов, смогут ли они предоставить текстовый интерфейс вместо или в дополнение к интерфейсу bytestring.
используйте одну функцию
csсData.String.Conversions.это позволит вам конвертировать между
String,ByteStringиText(а такжеByteString.LazyиText.Lazy), в зависимости от входных данных и ожидаемых типов.вы все еще должны вызвать его, но больше не беспокоиться о соответствующих типах.
посмотреть ответ для примера использования.
Comments