Добрый день.
Одна вещь, которую я теперь ненавижу в Haskell, это количество пакетов для работы со строкой.
Сначала я использовал нативные строки Haskell [Char]
, но когда я попытался начать использовать библиотеки хакерских программ, то полностьюпотерян в бесконечных обращениях.Кажется, что в каждом пакете используется реализация различных строк, а некоторые используют собственные вещи ручной работы.
Далее я переписал свой код с помощью Data.Text
строк и OverloadedStrings
расширения, я выбрал Text
, потому что он имеет более широкий наборфункций, но, похоже, многие проекты предпочитают ByteString
.Кто-то может дать краткое объяснение, почему использовать один или другой?
PS: кстати, как конвертировать из Text
в ByteString
?
Не удалось найти ожидаемый тип Data.ByteString.Lazy.Internal.ByteString для предполагаемого типа Текст Ожидаемый тип: IO Data.ByteString.Lazy.Internal.ByteString Тип вывода: IO Text
Я пытался encodeUtf8
из Data.Text.Encoding
, но не повезло:
Не удалось сопоставить ожидаемый тип Data.ByteString.Lazy.Internal.ByteString с предполагаемым типом Data.ByteString.Internal.ByteString
UPD:
Спасибо за ответы, что совершенство в чанках выглядит как путь, но я несколькоВ шоке от результата моя первоначальная функция выглядела так:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8"
А теперь стала:
htmlToItems :: Text -> [Item]
htmlToItems =
getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS
where
toLazyBS t = fromChunks [encodeUtf8 t]
fromLazyBS t = decodeUtf8 $ intercalate "" $ toChunks t
И да, эта функция не работает, потому что она неправильная, если мы поставим Text
к этому, тогда мы уверены, что этот текст правильно закодирован и готов к использованию, и конвертировать это глупочтобы сделать, но такое многословное преобразование еще должно произойти где-то за пределами htmltoItems
.