Haskell http管道中的ResumableSource结果为;无法构造无限类型";错误

Haskell http管道中的ResumableSource结果为;无法构造无限类型";错误,haskell,http-conduit,Haskell,Http Conduit,我正在尝试创建一个函数,该函数在给定一些参数的情况下创建一个源,以连接到URL,同时正确地保存在ResourceT monad中。我正在尝试以下方法: {-# LANGUAGE OverloadedStrings #-} import Control.Monad.IO.Class (liftIO) import Data.Conduit (($$), yield, unwrapResumable) import

我正在尝试创建一个函数,该函数在给定一些参数的情况下创建一个源,以连接到URL,同时正确地保存在ResourceT monad中。我正在尝试以下方法:

{-# LANGUAGE OverloadedStrings #-}

import           Control.Monad.IO.Class       (liftIO)
import           Data.Conduit                 (($$), yield, unwrapResumable)
import qualified Data.Conduit.List            as CL
import           Network.HTTP.Conduit
import           Network.HTTP.Types           (methodPost)
import Control.Monad.Trans.Resource (runResourceT)

runquery manager  = do
  initreq <- parseUrl "http://localhost/test"
  let request = initreq{method=methodPost, requestBody=RequestBodyLBS "test"}
  response <- http request manager
  (httpsource, finalizer) <- unwrapResumable (responseBody response)
  httpsource
  finalizer

main = do
  manager <- newManager conduitManagerSettings
  runResourceT $ (runquery manager $$ CL.mapM_ (liftIO . print))
当我添加签名时(我希望应该是):

我得到一个错误:

Couldn't match type ‘conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM
                       () ByteString (ResourceT IO)’
              with ‘ResourceT IO’
Expected type: conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM
                 () ByteString (ResourceT IO) ()
  Actual type: Source
                 (conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM
                    () ByteString (ResourceT IO))
                 ByteString

我可能正在做一些无法完成的事情,但我不太清楚问题出在哪里。

unwrapResumable、http和finalizer需要在resourceT中运行似乎只在MonadResource上下文(例如resourceT)中工作,因此您必须将它们放入其中

runquery :: MonadResource m => Manager -> Source m ByteString
-- or runquery :: Manager -> Source (ResourceT IO) ByteString
runquery manager  = do
  initreq <- parseUrl "https://localhost/test"
  let request = initreq{method=methodPost, requestBody=RequestBodyLBS "test"}
  response <- lift $ http request manager
  (httpsource, finalizer) <- lift $ unwrapResumable (responseBody response)
  httpsource
  lift finalizer

main :: IO ()
main = do
  manager <- newManager conduitManagerSettings
  runResourceT $ (runquery manager $$ CL.mapM_ (liftIO . print))
runquery::MonadResource m=>Manager->Source m ByteString
--或者通过testring运行query::Manager->Source(ResourceT IO)
runquerymanager=do

initreq您能发布错误吗?如果不复制、粘贴并以其他方式编译代码,就很难判断了。顺便说一句:您应该添加类型签名——即使Haskell会尽可能推断出它们;)好的-显而易见的问题是,在使用前需要提升
finalizer
,但是为什么要使用
http
,而不是
httpLbs
,甚至
simpleHttp
?提升finalizer没有帮助,而且不可压缩的类型是'MonadIO m=>ResumableSource m->m(Source m o,m())`,这意味着不需要提升(我也不太明白)。我不使用httpLbs/simpleHttp,因为有很多数据我想以流式方式处理如果您选择了正确的,他们将为您处理终结器-顺便说一句:当然,您不需要取消
Source m
部分-您在这里的单子中-但是终结器只在
m
中,这就是错误的来源(此外,即使
终结器的类型正确,您也肯定不会为您生成结果(它只会是
()
))
Couldn't match type ‘conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM
                       () ByteString (ResourceT IO)’
              with ‘ResourceT IO’
Expected type: conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM
                 () ByteString (ResourceT IO) ()
  Actual type: Source
                 (conduit-1.2.4:Data.Conduit.Internal.Conduit.ConduitM
                    () ByteString (ResourceT IO))
                 ByteString
runquery :: MonadResource m => Manager -> Source m ByteString
-- or runquery :: Manager -> Source (ResourceT IO) ByteString
runquery manager  = do
  initreq <- parseUrl "https://localhost/test"
  let request = initreq{method=methodPost, requestBody=RequestBodyLBS "test"}
  response <- lift $ http request manager
  (httpsource, finalizer) <- lift $ unwrapResumable (responseBody response)
  httpsource
  lift finalizer

main :: IO ()
main = do
  manager <- newManager conduitManagerSettings
  runResourceT $ (runquery manager $$ CL.mapM_ (liftIO . print))