我如何putStrLn Data.ByteString.Lazy.Internal.ByteString?

时间:2015-02-13 12:49:21

标签: string haskell io output adhoc-polymorphism

我使用encode(通过JSON将Haskell类型转换为字符串):

import GHC.Generics
import Data.Aeson

字符串是(根据编译器的错误消息):Data.ByteString.Lazy.Internal.ByteString

我该如何设置它?

理论上放

我正在搜索的是一个特殊的多态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)

另见

类似的问题,但类型有点不同:How do I putStrLn a Data.ByteString.Internal.ByteString?

3 个答案:

答案 0 :(得分:2)

这实际上取决于您的ByteString。它真的包含可打印的字符吗?它的编码是什么?如果您知道toString包含有效的UTF-8,则可以使用utf8-string中的putStrLn,然后将其传递给{{1}}。

顺便说一下,Hayoo对于这类问题很有用。在那里放一个类型,它将从Hackage获得这些类型的函数!

答案 1 :(得分:2)

您可以使用string-class包,它有三个选项:toString函数(默认为utf-8),fromLazyByteString函数和putStrLn适用于所有类型。请注意,您需要这样做:

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

答案 2 :(得分:0)

在这种情况下,我们有一个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变体。我会试着找出这个。

smart string-class

要想以聪明的方式,还要查看another answer by Konstantine Rybnikov中提到的string-class包。