2013-01-12 10 views
5

Sto sperimentando con il pacchetto conduit. Avendo anche trovato il pacchetto network-condotto, ho provato a fare un semplice client TCP che invia i contenuti di un file a una presa di corrente:conduit e network-conduit: combina MonadResource e 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") 

Questo non funziona, tuttavia, dal momento che il lavandino applicazione non vive un un 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. 

senza la runResourceT, tuttavia, chiaramente non può funzionare sia:

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

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

la mia ipotesi è che dovrei avvolgere l'appSink (dove m = iO) in ResourceT senzaeffettivamente gestendo le risorse. Ma non riesco a capire come farlo.

...?

risposta

5

Ho capito da solo ... bastava avvolgere l'intero runTCPClient in runResourceT.

+0

Dal momento che hai capito dovrebbe accettare la tua risposta quindi come corretta. In questo modo apparirà come risposta accettata nella ricerca di SO. – Davorak