2013-01-12 9 views
5

Eksperymentuję z pakietem przewodowym. Mając również pakiet sieciowy-kanałową, starałem się zrobić prostego klienta TCP, który wysyła zawartość pliku do gniazda:Kanał kablowy i sieciowy: Połącz MonadResource i 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") 

to nie zadziała jednak, ponieważ umywalka aplikacja nie żyją typu A 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. 

bez runResourceT, jednak wyraźnie nie działa albo:

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

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

Domyślam się, że należy owinąć appSink (gdzie m = IO) w ResourceT bez faktycznie zarządza zasobami. Ale nie mogę pojąć, jak to zrobić.

...?

Odpowiedz

5

Sam się zorientowałem ... wystarczy, że zawinę cały runTCPClient do runResourceT.

+0

Odkąd to wymyśliłeś, powinna zaakceptować twoją odpowiedź, wtedy jak poprawna. W ten sposób pojawi się jako zaakceptowana odpowiedź w wyszukiwaniu SO. – Davorak

Powiązane problemy