5

コンジットパッケージを試しています。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 にラップする必要があります。しかし、私はそれを行う方法を理解できません。

...?

4

1 に答える 1

5

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

于 2013-01-12T13:56:00.497 に答える