Добрый день.
Единственное, что я ненавижу в Haskell, - это количество пакетов для работы со строкой.
Сначала я использовал собственные строки Haskell [Char]
, но когда я попытался начать использовать библиотеки hackage, то полностью потерялся в бесконечных конверсиях. Кажется, что каждый пакет использует реализацию разных строк, некоторые из них принимают свою собственную вещь ручной работы.
Затем я переписал свой код с помощью строк Data.Text
и расширения OverloadedStrings
, я выбрал Text
, потому что он имеет более широкий набор функций, но кажется, что многие проекты предпочитают ByteString
.
Кто-то может дать короткое объяснение, почему использовать тот или иной?
PS: btw, как преобразовать из 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:
Спасибо за ответы, что * Chunks goodness выглядит как способ пойти, но я несколько шокирован результатом, моя оригинальная функция выглядела так:
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
.