関数f :: ByteString -> Stringがあり、が必要Sink ByteString (ResourceT IO)です。どうすればこれを入手できますか?
残念ながら、ドキュメントはあまり役に立ちませんでした...
この問題の一般的な解決策は次のとおりです。任意の function を取りi -> r、iは aであり、すべてのを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は であるためMonoid、タイプ の関数をByteString -> Stringの引数として使用できますmonoidFold。
myMD5 :: ByteString -> String
monoidFold myMD5 :: Monad m => Sink ByteString m String
このコンジットで resourceT を使用する必要がある理由がわかりません。
すべての小さなバイト文字列から構成される 1 つの大きな文字列ですべてを返すには、しばらく断片を蓄積してから最後に返す必要があります。
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)