関数f :: ByteString -> String
があり、が必要Sink ByteString (ResourceT IO)
です。どうすればこれを入手できますか?
残念ながら、ドキュメントはあまり役に立ちませんでした...
この問題の一般的な解決策は次のとおりです。任意の function を取りi -> r
、i
は aであり、すべてのを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
このコンジットで 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)