Как мне поместить StrLn в Data.ByteString.Lazy.Internal.ByteString?

Я использую encode (Тип Haskell через JSON в строку):

import GHC.Generics
import Data.Aeson

Строка есть (согласно сообщению об ошибке от компилятора): Data.ByteString.Lazy.Internal.ByteString,

Как мне поставить StrLn это?

теоретически

То, что я ищу, это специальная полиморфная putStrLnищу подходящий экземпляр putStrLn семантика для определенного строкового типа.

сообщения компилятора

Сообщение компилятора, если кому-то интересно:

valencies.lhs:182:22:
    Couldn't match type `Data.ByteString.Lazy.Internal.ByteString'
                  with `[Char]'
    Expected type: String
      Actual type: Data.ByteString.Lazy.Internal.ByteString
    In the return type of a call of `encode'
    In the first argument of `putStrLn', namely `(encode CALL)'
    In the expression: putStrLn (encode CALL)

смотрите также

Подобный вопрос, но с немного другим типом: как я могу поместить StrLn в Data.ByteString.Internal.ByteString?,

3 ответа

Это действительно зависит от вашего ByteString, Он действительно содержит печатные символы? Какая на нем кодировка? Ты можешь использовать toString от utf8-string если вы знаете, что он содержит действительный UTF-8, а затем передать его putStrLn,

Кстати, Hayoo отлично подходит для этого типа (хе-хе) вопросов. Поместите туда тип, и вы получите функции из Hackage с этими типами!

Вы можете использовать пакет string-class, он имеет три варианта: toString функция (по умолчанию utf-8), fromLazyByteString функция и putStrLn это работает со всеми типами. Обратите внимание, что вам нужно сделать:

import Prelude hiding (putStrLn)
import Data.String.Class (putStrLn)

В этом случае у нас есть Lazy вариант, поэтому мы должны использовать Data.ByteString.Lazy.putStrLn,

Обратите внимание, что компилятор выдает интересное предупреждение:

In the use of `Data.ByteString.Lazy.putStrLn'
(imported from Data.ByteString.Lazy):
Deprecated: "Use Data.ByteString.Lazy.Char8.putStrLn instead. (Functions that rely on ASCII encodings belong in Data.ByteString.Lazy.Char8)"

Вероятно, если я хочу строки в кодировке UTF-8, я должен использовать другой вариант, а не рекомендуемый Char8 один. Я постараюсь выяснить это.

смарт-класс

Для умного пути, также посмотрите на string-class Пакет упоминается в другом ответе Константина Рыбникова.

Другие вопросы по тегам