Wie hängt man eine ResumableSource
an eine andere an, wenn sie nicht explizit eine Instanz von Monad
ist? Hier ist ein Spielzeugbeispiel unten - a
hat Monad
Constraint, während b
es nicht hat. So können wir a's
hängen, aber nicht b's
:Eine resumableSource an eine andere anhängen
Prelude> import Data.Conduit
Prelude Data.Conduit> import Data.ByteString as BS
Prelude Data.Conduit BS> import Control.Monad.Trans.Resource
Prelude Data.Conduit BS Control.Monad.Trans.Resource> let a = newResumableSource (yield (BS.pack [5])) -- this one has monad constraint
Prelude Data.Conduit BS Control.Monad.Trans.Resource> :t a
a :: Monad m => ResumableSource m ByteString
Prelude Data.Conduit BS Control.Monad.Trans.Resource> :t a >> a
a >> a
:: (Monad m, Monad (ResumableSource m)) =>
ResumableSource m ByteString
Prelude Data.Conduit BS Control.Monad.Trans.Resource> let b = undefined :: ResumableSource (ResourceT IO) ByteString
Prelude Data.Conduit BS Control.Monad.Trans.Resource> :t b >> b
<interactive>:1:3:
No instance for (Monad (ResumableSource (ResourceT IO)))
arising from a use of ‘>>’
In the expression: b >> b
Der Grund, warum ich es bin zu fragen, weil ich ein HTTP ResumableSource
mit gleichem Typ wie b
oben habe, auf die ich mag den Content-Length Zierer, bevor es Verfütterung an sinken. Derzeit sieht es wie folgt aus:
responseBody rsp $$+- sink
Was ich zu so etwas ändern mögen:
((newResumableSource (yield content-len)) >> (responseBody rsp)) $$+- sink
Beachten Sie sorgfältig die abgeleitete Art von 'a >> a :: (Monad m, Monad (wiederaufladbare Quelle m)) => ResumableSource m ByteString'. Wenn Sie 'm' instanziieren, sucht der Elaborator nach einer Instanz von' Monad (ResumableSource m) '. Da 'ResumableSource' keine 'Monad'-Instanz hat, schlägt die Typprüfung fehl. Mit anderen Worten, es gibt keine Möglichkeit, _a_a_a_zu verwenden. –
ha, ja, guter Punkt. Frage mich, ob ich einfach einen Ertrag erzielen könnte, ohne dass die Senke nach der ersten Quelle beendet wird? Wie 'Ausbeute Inhalt-len $$ sinken; (responseBody rsp)) $$ + - sinken. – Sal