簡體   English   中英

懶惰的字節串瘋狂

[英]Lazy bytestring insanity

我真的很想弄清楚這個圓圈。

getPostContent使用Wreq下載博客帖子並返回。

getPostContent url = do
    let opts = defaults & W.checkStatus .~ (Just $ \_ _ _ -> Nothing)

    postResp <- getWith opts $ baseUrl ++ url
    if postResp ^. W.responseStatus . statusCode == 200
        -- then return $ LEnc.encodeUtf8 $ postResp ^. W.responseBody . _String      -- :: Prism T Text
        then return $ postResp ^. W.responseBody . _String
        else return "error downloading"

由parseLBS使用

do
     page <- getPostContent r -- :: IO String
     let
     -- parseLBS :: Data.ByteString.Lazy.Internal.ByteString -> Text.XML.Document
     cursor = fromDocument $ parseLBS page

據我了解,getPostContent提供Data.Text.Text ,而我需要Data.ByteString.Lazy.Internal.ByteString ,我不知道如何轉換它們(以為應該是this ,請參見上面的代碼片段,但確實如此)也不能編譯)。

   Couldn't match expected type ‘Data.ByteString.Lazy.Internal.ByteString’
                with actual type ‘T.Text’
    In the first argument of ‘parseLBS’, namely ‘page’
    In the second argument of ‘($)’, namely ‘parseLBS page’

編碼未注釋的編譯消息

Couldn't match type ‘TL.Text’
               with ‘T.Text’
NB: ‘TL.Text’ is defined in ‘Data.Text.Internal.Lazy’
    ‘T.Text’ is defined in ‘Data.Text.Internal’
Expected type: (TL.Text -> Const TL.Text TL.Text)
               -> Data.ByteString.Lazy.Internal.ByteString
               -> Const TL.Text Data.ByteString.Lazy.Internal.ByteString
  Actual type: (T.Text -> Const TL.Text T.Text)
               -> Data.ByteString.Lazy.Internal.ByteString
               -> Const TL.Text Data.ByteString.Lazy.Internal.ByteString
In the second argument of ‘(.)’, namely ‘_String’
In the second argument of ‘(^.)’, namely ‘responseBody . _String’

總結一下: encodeUtf8是正確的方法。 似乎您正在使用的是Data.Text.Lazy.Encoding ,它需要一個惰性Text 您可以使用Data.Text.Lazy.fromStrict進行轉換...,也可以查看Data.Text.Encoding ,它可以在嚴格的Text (但隨后會提供嚴格的ByteString ...)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM