我想将网页内容写入文件。但是我被困在文件写作部分。因为它给我一个类型错误。
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 :(得分:0)
您的代码:
body <- (response ^. responseBody)
应该是:
let body = response ^. responseBody
解释您获得的类型错误:编译器说Couldn't match type ‘IO BL.ByteString’ with ‘BL.ByteString’
。所以它用你编写的代码说的是期待IO ByteString
,但你给了ByteString
。这取决于<-
块中的do
运算符。这个,看起来像response ^. responseBody >>= \body -> <rest of code>
。
(>>=)
的类型为Monad m => m a -> (a -> m b) -> m b
。所以编译器认为你说response ^. responseBody
的类型为m a
或更具体IO a
(其中a
为ByteString
)。
幸运的是,我们可以在let
块中使用do
并以这种方式指定body
:)