Текст или Bytestring



Добрый день.



единственное, что я сейчас ненавижу в Haskell-это количество пакетов для работы со строкой.



сначала я использовал родной Haskell [Char] строки, но когда я попытался начать использовать библиотеки hackage, то полностью потерял в бесконечных преобразованиях. Каждый пакет, кажется, использовать различные строки реализации, некоторые принимает их собственную вещь ручной работы.



далее я переписал свой код с Data.Text строки и

625   3  

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

    Ничего не найдено.