【发布时间】:2017-10-28 12:47:04
【问题描述】:
我正在创建一个可以读取二进制文件的管道。东西可能会出错,所以我需要一个带有一些错误处理的 monad;现在Maybe 已经足够好了。
我想使用sourceFile,它要求conduit monad是MonadResource,这就是问题的症结所在。
我从the docs 看到,例如MaybeT m 有一个实例,但它要求m 已经是MonadResource;事实上,所有情况都是如此。以我有限的理解,这听起来像是鸡和蛋的事情,无论如何都要求我手动编写MonadResource 实例?
我假设要读取文件,我的 monad 必须包含 IO。那么这一切是否意味着我必须为MaybeT IO 编写一个MonadResource 实例?如果是这样,关于如何做到这一点的任何指示?
【问题讨论】:
-
(MonadThrow m, MonadBase IO m, MonadIO m, Applicative m) => MonadResource (ResourceT m)不是递归的。 -
啊哈,错过了。我猜是时候深入了解
ResourceT的工作原理了.. -
只是某种形式的
main = runResourceT . runConduit $ sourceFile …应该可以工作。
标签: haskell monads monad-transformers conduit