1

我(Haskell 新手)正在尝试对从网页收到的 ByteString 执行解包操作。基本上我想从网页中搜索几个单词,所以我试图标记流,然后从单词中搜索单词。

Prelude Network.HTTP.Conduit LB> LB.unpack (simpleHttp WebLink)

但我得到以下错误

<interactive>:75:12: error:
• Couldn't match expected type ‘LB.ByteString’
              with actual type ‘m0 LB.ByteString’
• In the first argument of ‘LB.unpack’, namely...

从hackage我可以看到它的签名是

unpack :: ByteString -> [Word8] Source
O(n) Converts a ByteString to a '[Word8]'.
4

2 回答 2

3

simpleHttp "http://example.com"是类型的m ByteString,对于某些单子m来说,例如类型IO ByteString。使用do符号可以得到结果。

import Network.HTTP.Conduit
import qualified Data.ByteString.Lazy.Char8 as LB

main :: IO ()
main = do
  res <- simpleHttp "http://example.com"
  let string = LB.unpack res
  putStr string

或者在 ghci 中,

ghci> res <- simpleHttp "http://example.com"
ghci> LB.unpack res
于 2016-11-07T18:52:58.153 回答
2

simpleHttp WebLink似乎是一个返回值的单子动作,它本身不是 ByteString 。您必须运行该过程,获取该值,然后(假设它是一个字节串)您可以解压它。

请注意,simpleHttp我知道的过程不会返回字节串。您需要对返回值进行模式匹配以检查Either类型,如果它是响应消息而不是失败,那么您可以进一步对响应进行模式匹配。

于 2016-11-07T17:50:39.627 回答