2

関数f :: ByteString -> Stringがあり、が必要Sink ByteString (ResourceT IO)です。どうすればこれを入手できますか?

残念ながら、ドキュメントはあまり役に立ちませんでした...

4

2 に答える 2

3

この問題の一般的な解決策は次のとおりです。任意の function を取りi -> riは 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
于 2012-08-16T16:45:07.527 に答える
1

このコンジットで 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)
于 2012-08-16T14:48:17.700 に答える