J'ai une fonction f :: ByteString -> String
, et j'ai besoin d'un Sink ByteString (ResourceT IO)
. Comment l'obtenir?Soulever une fonction vers un évier de conduit
Malheureusement, les documents ne sont pas très utiles ...
J'ai une fonction f :: ByteString -> String
, et j'ai besoin d'un Sink ByteString (ResourceT IO)
. Comment l'obtenir?Soulever une fonction vers un évier de conduit
Malheureusement, les documents ne sont pas très utiles ...
Je ne sais pas pourquoi vous avez besoin de quelque chose à voir avec resourceT dans ce conduit. Pour retourner le tout dans une grande chaîne composée de toutes les petites bytestrings, vous devrez accumuler des pièces pendant un certain temps, puis le retourner à la fin.
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)
Merci pour votre réponse. L'exigence pour ResourceT est juste due à la façon dont Yesod gère les téléchargements de fichiers depuis la version 1.1. Vous obtenez un 'Source (ResourceT IO) ByteString' au lieu d'un' ByteString' tel qu'il était dans Yesod 1.0. – mrueg
Voici une solution générale au problème: nous allons prendre toute fonction i -> r
, où i
est un Monoid
, et la transformer en un évier en pliant tous les await
s avec 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
Depuis ByteString
est un Monoid
, votre fonction du type ByteString -> String
peut être utilisé comme argument de monoidFold
.
myMD5 :: ByteString -> String
monoidFold myMD5 :: Monad m => Sink ByteString m String
très instructif, merci – fp4me
Que voulez-vous que l'évier fasse? – dave4420
Et 'Sink ByteString (ResourceT IO)' n'est pas un type. Voulez-vous dire 'Sink ByteString (ResourceT IO) String'? – dave4420
Oui, désolé.Sink ByteString (ResourceT IO) String' était nécessaire. Le récepteur était supposé prendre le résultat de fileSource dans un téléchargement de fichier Yesod, et calculer son hachage md5 (en utilisant 'Yesod.Static.base64md5'). – mrueg