如何在管道管道中转换monad?

时间:2017-11-05 08:35:35

标签: mongodb haskell conduit

我正在尝试使用Database.MongoDB软件包将文件从磁盘复制到MongoDB GridFS中的文件。

main :: IO ()
main = do
  pipe <- MDB.connect (host "127.0.0.1")
  _ <- access pipe master "baseball" run
  close pipe

run :: MDB.Action IO GFS.File
run = do
  uploadImage "sandbox/bat.jpg"

uploadImage :: Text -> MDB.Action IO GFS.File
uploadImage src = do
  bucket <- GFS.openDefaultBucket
  runConduitRes $ sourceFileBS (unpack src) .| (hole $ GFS.sinkFile  bucket src)

这不起作用,因为 sourceFileBS 期望作为基础monad中的Resource而 GFS.sinkFile 希望MongoDB成为 Action (a专业读者)。

将这些导管连接在一起的优雅方法是什么?

1 个答案:

答案 0 :(得分:1)

如果没有所有可用的类型和功能,有点难以告诉您最佳方法。但是,应该工作的一种方式看起来像这样:

withBinaryFile (unpack src) ReadMode $ \h -> runMongo $ runConduit $
  sourceHandle h .| GFS.sinkFile bucket src