簡體   English   中英

如何將StrutLn設置為Data.ByteString.Lazy.Internal.ByteString?

[英]How do I putStrLn a Data.ByteString.Lazy.Internal.ByteString?

我使用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)

也可以看看

類似的問題,但類型有所不同: 如何將StrutLn設置為Data.ByteString.Internal.ByteString?

這確實取決於您的ByteString 它真的包含可打印字符嗎? 它的編碼是什么? 如果您知道它包含有效的UTF-8,則可以使用utf8-string toString ,然后將其傳遞給putStrLn

順便說一句, Hayoo非常適合此類問題。 在其中放置一個類型,它將為您提供來自Hackage的具有這些類型的功能!

您可以使用字符串類包,它具有三個選項: 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 我將嘗試找出答案。

智能字符串類

作為一種聰明的方法,還可以看看Konstantine Rybnikov的另一個答案中提到的string-class包。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM