2015-12-17 2 views
1

Я действительно борюсь за квадрат этого круга.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’ 
+0

Он смотрит на меня, как 'encodeUtf8' или подобное должно работать. Когда вы говорите, что это «не компилируется», с чем это происходит? – MathematicalOrchid

+0

добавил, что сообщение компилятора тоже –

+2

Право. Поэтому 'encodeUtf8' хочет ленивый' Text', но у вас строгий 'Text'. Я думаю, что есть функция преобразования где-то ... Да, попробуйте 'Data.Text.Lazy.toStrict' или' fromStrict'. – MathematicalOrchid

ответ

2

Резюмируя: encodeUtf8 правильный путь. Кажется, что вы используете от Data.Text.Lazy.Encoding, что требует ленивого Text. Вы можете использовать Data.Text.Lazy.fromStrict конвертировать ... Или вы можете посмотреть в Data.Text.Encoding, который работает на строгом Text (а затем дает вам строгий ByteString ...)

Смежные вопросы