将功能提升到Conduit Sink

时间:2012-08-16 12:55:22

标签: haskell yesod conduit

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

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

2 个答案:

答案 0 :(得分:3)

以下是该问题的一般解决方案:让我们采用任何函数i -> r,其中iMonoid,并通过折叠所有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

由于ByteStringMonoid,因此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)