2013-01-12 11 views
5

संयोजन मैं कंड्यूट पैकेज के साथ प्रयोग कर रहा हूं। भी होने नेटवर्क नाली पैकेज नहीं मिला, मैं एक साधारण टीसीपी ग्राहक जो एक सॉकेट करने के लिए एक फ़ाइल की सामग्री भेजता करने की कोशिश की:कंडिट और नेटवर्क-कंडिट: मोनाड रिसोर्स और आईओ

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 = आईओ) ResourceT में बिनावास्तव में संसाधनों का प्रबंधन। लेकिन मैं यह नहीं समझ सकता कि यह कैसे करना है।

...?

उत्तर

5

इसे स्वयं समझ लिया ... पूरे रन TCPClient को runResourceT में लपेटने की आवश्यकता है।

+0

चूंकि आपने यह अनुमान लगाया है कि इसे आपके उत्तर को सही के रूप में स्वीकार करना चाहिए। इस तरह यह एसओ की खोज में एक स्वीकार्य उत्तर के रूप में दिखाई देगा। – Davorak