Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用管道将文件源文件发送到HTTP请求_Haskell_Amazon Web Services_Amazon S3_Yesod - Fatal编程技术网

Haskell 使用管道将文件源文件发送到HTTP请求

Haskell 使用管道将文件源文件发送到HTTP请求,haskell,amazon-web-services,amazon-s3,yesod,Haskell,Amazon Web Services,Amazon S3,Yesod,我在尝试构造请求体资源IO时遇到问题。 我对导管更新,正在尝试使用aws包将文件上载到S3 io $ withManager $ \mgr -> do Aws.pureAws cfg s3cfg mgr $ S3.putObject stcompleted "job.zip" $ RequestBodySourceChunked $ do CB.sourceFile "job.zip" 我收到的类型错误是这样的

我在尝试构造
请求体资源IO
时遇到问题。 我对导管更新,正在尝试使用
aws
包将文件上载到S3

io $ withManager $ \mgr ->
      do Aws.pureAws cfg s3cfg mgr $ S3.putObject stcompleted "job.zip" $ 
            RequestBodySourceChunked $ do
                  CB.sourceFile "job.zip"
我收到的类型错误是这样的

  Couldn't match type `Data.ByteString.Internal.ByteString'
                  with `Blaze.ByteString.Builder.Internal.Types.Builder'
    Expected type: Source
                     (ResourceT IO) Blaze.ByteString.Builder.Internal.Types.Builder
      Actual type: ConduitM
                     () Data.ByteString.Internal.ByteString (ResourceT IO) ()
    In the return type of a call of `CB.sourceFile'
    In a stmt of a 'do' block: CB.sourceFile "job.zip"
    In the second argument of `($)', namely
      `do { CB.sourceFile "job.zip" }'
putObject的类型为

putObject
  :: Bucket
     -> Data.Text.Internal.Text
     -> http-conduit-1.9.5.2:Network.HTTP.Conduit.Types.RequestBody
          (Control.Monad.Trans.Resource.Internal.ResourceT IO)
     -> PutObject
我不知道如何构造RequestBody ResourceT IO,因为RequestBody的可能构造函数不包括ResourceRecet IO

data RequestBody m
  = RequestBodyLBS Data.ByteString.Lazy.Internal.ByteString
  | RequestBodyBS Data.ByteString.Internal.ByteString
  | RequestBodyBuilder GHC.Int.Int64
                       Blaze.ByteString.Builder.Internal.Types.Builder
  | RequestBodySource GHC.Int.Int64
                      (Data.Conduit.Internal.Source
                         m Blaze.ByteString.Builder.Internal.Types.Builder)
  | RequestBodySourceChunked (Data.Conduit.Internal.Source
                                m Blaze.ByteString.Builder.Internal.Types.Builder)
这里的关键(稍微清理一下)是:

无法将类型ByTestString与生成器匹配

所以第一个问题是:如何将ByteString转换为生成器?我们得到了一些可能的点击,结果是最好的

下一个问题是如何转换
以产生新类型的值。这需要对导管有一些了解,对此我推荐。但其想法是创建一个数据转换器(一个
管道
),它通过testrings转换
的传入流,并生成
Builder
s的传出流,并将其与
融合

对于第一步,我们希望使用
Data.conductor.List
中的
map
抽象。对于第二个,融合操作符是
$=
。综上所述,我们有:

CB.sourceFile "job.zip" $= Data.Conduit.List.map fromByteString
正是我遇到的问题。谢谢,谢谢!!而且,您的库非常棒!:)