[英]How do I putStrLn a Data.ByteString.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.