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.
...?
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