1
你如何添加一個ResumableSource
到另一個時,他們沒有明確的Monad
一個實例?這是下面一個玩具的例子 - a
有Monad
約束而b
沒有它。因此,我們可以追加a's
但不b's
:追加一個ResumableSource到另一個
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
的原因,我問它,因爲我有相同類型的HTTP ResumableSource
如上b
,我會喜歡預先設置內容長度,將其送入前水槽。目前,它看起來像這樣:
responseBody rsp $$+- sink
我會想改變的東西是這樣的:
((newResumableSource (yield content-len)) >> (responseBody rsp)) $$+- sink
請仔細注意'a >> a ::(Monad m,Monad(ResumableSource m))=> ResumableSource m ByteString'的推斷類型。當你實例'M',該elaborator將搜索的'單子(ResumableSource米)'一個實例。由於'ResumableSource'沒有'Monad'實例,因此類型檢查將失敗。換句話說,沒有辦法來使用'a >> a'。 –
公頃,是的,好點。想知道如果我能只是做一個收益率,而不下沉終端的第一源完成後沉沒?像'yield content-len $$ sink; (responseBody rsp))$$ + - sink'。 – Sal