У меня есть функция f :: ByteString -> String
, и мне нужен Sink ByteString (ResourceT IO)
. Как мне это получить?
К сожалению, документы не очень помогли...
У меня есть функция f :: ByteString -> String
, и мне нужен Sink ByteString (ResourceT IO)
. Как мне это получить?
К сожалению, документы не очень помогли...
Я не уверен, зачем вам нужно что-то делать с 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)
Source (ResourceT IO) ByteString
вместо ByteString
, как это было в Yesod 1.0.
- person mrueg; 16.08.2012
Вот общее решение проблемы: давайте возьмем любую функцию i -> r
, где i
— это 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
Sink ByteString (ResourceT IO)
не тип. Вы имеете в видуSink ByteString (ResourceT IO) String
? - person dave4420   schedule 16.08.2012Sink ByteString (ResourceT IO) String
был нужен. Приемник должен был получить результат fileSource при загрузке файла Yesod и вычислить его хэш md5 (используяYesod.Static.base64md5
). - person mrueg   schedule 16.08.2012