2016-06-21 1 views
1

に1 ResumableSourceを追加は?ここでは下記のおもちゃの一例である - bがそれを持っていませんがaMonad制約があります。だから我々はa'sなくb'sを追加することができますは、彼らが明示的<code>Monad</code>のインスタンスでないときは、別のものに1 <code>ResumableSource</code>を追加するにはどうすればよい別の

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 

私はそれを求めていた理由を、私は、上記のbと同じ型を持つHTTP ResumableSourceを持って、私はそれを供給する前に、コンテンツの長さを付加するようになるためにどのので、シンク。私はこのようなものに変更するようになる

responseBody rsp $$+- sink 

ResumableSourceに初期メッセージを付加する

((newResumableSource (yield content-len)) >> (responseBody rsp)) $$+- sink 
+0

注注意深く '>> A ::の推論型(モナドのM、モナド(ResumableSourceのM))=> ResumableSource M ByteString'。 'm'をインスタンス化すると、精巧さは' Monad(ResumableSource m) 'のインスタンスを検索します。 'ResumableSource'は' Monad'インスタンスを持たないので、型検査は失敗します。言い換えれば、 'a >> a'を使用する方法はありません。 –

+0

ha、うん、良い点。最初の情報源が終わった後にシンクがなくなると、私は降伏するしかないのだろうか? 'yield content-len $$ sinkのように。 (responseBody rsp))$$ + - sink'となります。 – Sal

答えて

0

良い方法がconduitた利回りを使用するように思わ現在のところ、それはこのようになりますその最初のメッセージはパススルーになります。今、私たちの間にそれを合わせてresponseBody rsp $$+- sinkコードを更新

passThruWInit :: Monad m => BS.ByteString -> C.Conduit BS.ByteString m BS.ByteString 
passThruWInit initMsg = do 
    C.yield initMsg -- generate initial message first 
    C.awaitForever $ C.yield -- now pass-through conduit for all messages 

:ここで、私は、このようなコンジットを作成するためにmap導管からコードを借りてきた

responseBody rsp $=+ passThruWInit someInitMsg $$+- sink 

最終結果someInitMsgをもたらしているということですまず、responseBodyのコンテンツがストリーミングされます。こうすることで、コンテンツの長さやその他のメタデータを再開可能なHTTPレスポンス本体に追加することができます。

関連する問題