ByteString需要不同的ByteString

时间:2014-01-14 14:02:06

标签: http haskell bytestring http-conduit

此代码没有进行类型检查:

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,但这会导致错误。

1 个答案:

答案 0 :(得分:3)

有两个单独的ByteString模块,一个用于惰性ByteStrings,另一个用于严格的ByteStrings。 simpleHTTP返回一个惰性字节串,但你导入了strict bytestring模块,因此unpack期望一个严格的字节串。

尝试更改

import qualified Data.ByteString.Char8 as BS

import qualified Data.ByteString.Lazy.Char8 as BS

也就是说,如果你使用字节串模块的Char8版本,你需要小心,因为String&lt; - &gt; ByteString转换仅在使用ASCII编码时才有效。我建议使用适当的编码功能converting your bytestrings to Text然后打印它。