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