2017-08-19 46 views
0

我想將網頁的內容寫入文件。但是我被困在文件寫入部分。因爲它給我一個類型錯誤。如何在Haskell中編寫HTTPS請求的文件響應體?

import Control.Lens 
import qualified Data.ByteString.Lazy as BL 
import Network.Wreq 

writeURIBodyToFile :: FilePath -> String -> IO() 
writeURIBodyToFile filePath uri = do 
    response <- get uri 
    body <- (response ^. responseBody) 
    BL.writeFile filePath body 

以下是錯誤:

Couldn't match type ‘IO BL.ByteString’ with ‘BL.ByteString’ 
Expected type: Getting 
       (IO BL.ByteString) (Response BL.ByteString) (IO BL.ByteString) 
    Actual type: (BL.ByteString 
       -> Const (IO BL.ByteString) BL.ByteString) 
       -> Response BL.ByteString 
       -> Const (IO BL.ByteString) (Response BL.ByteString) 
In the second argument of ‘(^.)’, namely ‘responseBody’ 
In a stmt of a 'do' block: body <- (response ^. responseBody) 

在此先感謝。

回答

0

您的代碼: body <- (response ^. responseBody)

應該是: let body = response ^. responseBody

要解釋你得到的錯誤類型:編譯器在說Couldn't match type ‘IO BL.ByteString’ with ‘BL.ByteString’。所以它說你寫的代碼是期待IO ByteString,但你給它一個ByteString。這取決於do區塊中的<-運營商。這個desugared,看起來像response ^. responseBody >>= \body -> <rest of code>

(>>=)的類型是Monad m => m a -> (a -> m b) -> m b。所以編譯器認爲你說的response ^. responseBody將具有m a或更具體地IO a(其中aByteString)的類型。

幸運的是,我們可以在一個do塊使用let並分配body這樣:)

相關問題