2

我有一个函数f :: ByteString -> String,需要一个Sink ByteString (ResourceT IO). 我怎么得到这个?

不幸的是,这些文档不是很有帮助......

4

2 回答 2

3

这是该问题的一般解决方案:让我们采用任何函数i -> r,其中ia ,并通过将所有s 与Monoid折叠起来将其变成接收器。awaitmappend

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
于 2012-08-16T16:45:07.527 回答
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)
于 2012-08-16T14:48:17.700 回答