2013-01-12 3 views
5

コンジットパッケージを試しています。また、ネットワーク・コンジットパッケージを見つけたが、私はソケットにファイルの内容を送信し、単純なTCPクライアントを作ってみました:コンジットとネットワークコンジット:MonadResourceとIOを組み合わせる

import Data.Conduit 
import Data.Conduit.Binary 
import Data.Conduit.Network 
import Data.ByteString.Char8 (pack) 

sendFile fileName appData = runResourceT $ 
    sourceFile fileName $$ appSink appData 

main = runTCPClient (clientSettings 8000 (pack "localhost")) (sendFile "book.tex") 

アプリシンクは住んでいないので、これは、しかし、動作しません。 ResourceT:

[1 of 1] Compiling Main    (Conduit2.hs, interpreted) 

Conduit2.hs:9:63: 
    Occurs check: cannot construct the infinite type: m0 = ResourceT m0 
    Expected type: Application (ResourceT m0) 
     Actual type: AppData (ResourceT m0) -> m0() 
    In the return type of a call of `sendFile' 
    In the second argument of `runTCPClient', namely 
     `(sendFile "book.tex")' 
Failed, modules loaded: none. 

runResourceTないとは、しかし、それは明らかにどちらか動作しないことができます。

[1 of 1] Compiling Main    (Conduit2.hs, interpreted) 

Conduit2.hs:9:63: 
    No instance for (MonadResource IO) 
     arising from a use of `sendFile' 
...etc... 

私の推測では、私はせずにResourceTにappSink(M = IO)をラップするべきであるということです実際にリソースを管理しています。しかし、私はちょうどそれを行う方法を理解することはできません。

...?

答えて

5

自分で考えました... runTCPClient全体をrunResourceTにラップするだけで済みます。

+0

あなたが理解したので、正しい答えを受け入れる必要があります。このようにして、SOの検索で受け入れられた答えが表示されます。 – Davorak

関連する問題