conduit и network-conduit: объедините MonadResource и IO

Я экспериментирую с пакетом трубопроводов. Найдя также пакет network-conduit, я попытался сделать простой TCP-клиент, который отправляет содержимое файла в сокет:

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

Я предполагаю, что мне следует обернуть appSink (где m = IO) в ResourceT без фактического управления ресурсами. Но я просто не могу понять, как это сделать.

...?


person firefrorefiddle    schedule 12.01.2013    source источник


Ответы (1)


Сам разобрался... просто нужно было обернуть весь runTCPClient в runResourceT.

person firefrorefiddle    schedule 12.01.2013
comment
Поскольку вы поняли это, следует принять ваш ответ как правильный. Таким образом, он будет отображаться как принятый ответ в поиске SO. - person Davorak; 13.11.2013