2013-01-12 17 views
5

Tôi đang thử nghiệm với gói ống dẫn. Cũng đã tìm thấy gói mạng-ống dẫn, tôi đã cố gắng tạo một máy khách TCP đơn giản gửi nội dung của tệp đến một ổ cắm:ống dẫn và ống dẫn mạng: Kết hợp MonadResource và 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") 

Điều này không có tác dụng, vì bồn rửa ứng dụng không hoạt động một một 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. 

Nếu không có sự runResourceT, tuy nhiên, nó rõ ràng có thể không làm việc, hoặc:

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

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

tôi đoán là tôi nên quấn appSink (nơi m = IO) vào ResourceT không thực sự quản lý tài nguyên. Nhưng tôi không thể tìm ra cách để làm điều đó.

...?

Trả lời

5

Đã tìm ra chính mình ... chỉ cần để bọc toàn bộ runTCPClient vào runResourceT.

+0

Vì bạn đã tìm ra nó nên chấp nhận câu trả lời của bạn sau đó là chính xác. Bằng cách này Nó sẽ hiển thị như có một câu trả lời được chấp nhận trong tìm kiếm của SO. – Davorak

Các vấn đề liên quan