我有一个函数f :: ByteString -> String
,需要一个Sink ByteString (ResourceT IO)
. 我怎么得到这个?
不幸的是,这些文档不是很有帮助......
这是该问题的一般解决方案:让我们采用任何函数i -> r
,其中i
a ,并通过将所有s 与Monoid
折叠起来将其变成接收器。await
mappend
import Data.Conduit
import Data.Conduit.List as CL
import Data.Monoid
monoidFold :: (Monoid i, Monad m) => (i -> r) -> Sink i m r
monoidFold f = f `fmap` CL.fold mappend mempty
由于ByteString
是 a Monoid
,因此您的类型函数ByteString -> String
可以用作 的参数monoidFold
。
myMD5 :: ByteString -> String
monoidFold myMD5 :: Monad m => Sink ByteString m String
我不确定为什么您需要在此管道中与 resourceT 有任何关系。
为了将它全部返回到一个由所有小字节串组成的大字符串中,您必须积累一段时间,然后将其返回到结尾。
fSink :: Monad m => Sink ByteString m String
fSink = go []
where
go accum = do
x <- await
case x of
Nothing -> return . f . B.concat . reverse $ accum
Just x' -> go (x':accum)