0

我使用encode(通过 JSON 到字符串的 Haskell 类型):

import GHC.Generics
import Data.Aeson

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

我怎么把StrLn呢?

理论上说

我正在寻找的是一个 ad-hoc polymorphic 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?.

4

3 回答 3

2

这真的取决于你的ByteString. 它真的包含可打印的字符吗?它的编码是什么?如果您知道它包含有效的 UTF-8,则可以使用toStringfrom utf8-string,然后将其传递给putStrLn.

顺便说一句,Hayo非常适合这类问题(呵呵)。把一个类型放在那里,它会让你从 Hackage 中获得这些类型的功能!

于 2015-02-13T14:58:04.857 回答
2

您可以使用string-class包,它具有三个选项:toString函数(默认为 utf-8)、fromLazyByteString函数,并且putStrLn适用于所有类型。请注意,您需要执行以下操作:

import Prelude hiding (putStrLn)
import Data.String.Class (putStrLn)
于 2015-02-13T18:14:16.427 回答
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。我会试着找出这个。

智能字符串类

对于一种聪明的方式,还可以查看Konstantine Rybnikov 的另一个答案string-class中提到的包。

于 2015-02-13T13:01:42.013 回答