我有一个功能f :: ByteString -> String
,需要一个Sink ByteString (ResourceT IO)
。
我怎么得到这个?
不幸的是,文档不是很有帮助......
答案 0 :(得分:3)
以下是该问题的一般解决方案:让我们采用任何函数i -> r
,其中i
是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
是Monoid
,因此ByteString -> String
类型的函数可以用作monoidFold
的参数。
myMD5 :: ByteString -> String
monoidFold myMD5 :: Monad m => Sink ByteString m String
答案 1 :(得分:1)
我不确定为什么在此管道中需要与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)