了解haskell中的错误

时间:2016-11-07 17:26:59

标签: haskell haskell-pipes http-conduit

我(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]'.

2 个答案:

答案 0 :(得分:3)

对于某些monad 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

答案 1 :(得分:2)

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

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