我在尝试构建RequestBody ResourceT 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的可能构造函数不包含ResoureceT 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)
答案 0 :(得分:4)
这里的关键(清理了一下)是:
无法将类型ByteString与Builder匹配
所以第一个问题是:如何将ByteString转换为Builder? Using Hoogle我们获得了一些可能的点击量,fromByteString证明是最好的。
接下来的问题是如何转换Source
以产生新类型的值。这需要对导管有所了解,我建议the conduit tutorial。但我们的想法是创建一个数据转换器(Conduit
)来转换ByteString
的传入流并产生一个Builder
s的输出流,并且 fuse 使用Source
。
首先,我们要使用map
的{{1}}抽象。对于第二个,融合算子是Data.Conduit.List
。总而言之,我们有:
$=