ByteString 需要不同的 ByteString



这段代码不进行类型检查:

import Network.HTTP.Conduit
import qualified Data.ByteString.Char8 as BS
main :: IO ()
main = do
  resp <- simpleHttp "http://www.google.com"
  putStrLn $ BS.unpack resp

引发以下错误:

Couldn't match expected type `BS.ByteString'
            with actual type `Data.ByteString.Lazy.Internal.ByteString'
In the first argument of `BS.unpack', namely `resp'
In the second argument of `($)', namely `BS.unpack resp'
In a stmt of a 'do' block: putStrLn $ BS.unpack resp
Failed, modules loaded: none.

如何解决这个问题?更改为其他 ByteString 变体不起作用。

simpleHttp函数的类型是这样的:simpleHttp :: Control.Monad.IO.Class.MonadIO m => String -> m Data.ByteString.Lazy.Internal.ByteString 。所以我尝试在 IO monad 中获取 ByteString 并尝试unpack它,但这会导致错误。

有两个独立的 ByteString 模块,一个用于惰性字节字符串,另一个用于严格字节字符串。 simpleHTTP 返回一个延迟字节串,但你导入了严格的字节串模块,所以解包需要严格的字节串。

尝试更改

import qualified Data.ByteString.Char8 as BS

import qualified Data.ByteString.Lazy.Char8 as BS

也就是说,如果您使用 Char8 版本的字节串模块,则需要小心,因为字符串 <-> 字节字符串转换仅在使用 ASCII 编码时才有效。我建议使用适当的编码函数将您的字节字符串转换为文本,然后打印它。

相关内容

  • 没有找到相关文章

最新更新