【发布时间】:2017-04-11 17:34:22
【问题描述】:
我发现使用流行的 Haskell 库进行流式下载的建议方法有两个:
- https://haskell-lang.org/library/http-client#Streaming
- http://www.alfredodinapoli.com/posts/2013-07-20-slick-http-download-in-haskell.html
如何将前者的代码修改为 (a) 保存到文件,以及 (b) 只打印一个(取 5 个)字节响应,而不是对标准输出的整个响应?
我对 (b) 的尝试是:
#!/usr/bin/env stack
{- stack --install-ghc --resolver lts-5.13 runghc
--package http-conduit
-}
{-# LANGUAGE OverloadedStrings #-}
import Control.Monad.IO.Class (liftIO)
import qualified Data.ByteString as S
import qualified Data.Conduit.List as CL
import Network.HTTP.Simple
import System.IO (stdout)
main :: IO ()
main = httpSink "http://httpbin.org/get" $ \response -> do
liftIO $ putStrLn
$ "The status code was: "
++ show (getResponseStatusCode response)
CL.mapM_ (take 5) (S.hPut stdout)
这未能映射(采取 5),并建议我除其他外,我仍然不明白映射 monads 或 liftIO 是如何工作的。
另外,这个资源:
http://haskelliseasy.readthedocs.io/en/latest/#note-on-streaming
...给了我一个警告,“我知道自己在做什么,我希望对资源进行更细粒度的控制,例如流媒体”,这并不容易或普遍支持。
我看过的其他地方:
- Downloading large files from the Internet in Haskell
- https://hackage.haskell.org/package/wreq
- https://hackage.haskell.org/package/pipes-http
如果 Haskellverse 中有任何东西可以让这更容易,更像是 Python 的请求:
response = requests.get(URL, stream=True)
for i,chunk in enumerate(response.iter_content(BLOCK)):
f.write(chunk)
我也很感激那里的提示,或者指向 2016 年最先进技术的指针。
【问题讨论】:
-
你真的需要流式传输吗? (那么您是否一次获得了足够多的数据,以至于将其全部存储在内存中是不可接受的?)
-
是的,我是。
-
我可能应该选择更合理的字节数,比如一些 2^n...