निम्नलिखित समारोह पर एक नजर डालें।
इस प्रकार, कॉल के बाद, हमें (MonadResource m, CSV ByteString a)
मिलता है। हम इस समय एक उचित प्रकार का पता लगाने के लिए इसे हल कर सकते हैं। हम इस ऑपरेशन में IO
प्रदर्शन कर रहे हैं, इसलिए MonadResource m
, m
के लिए केवल ResourceT IO
होना चाहिए, जो के अनुसार MonadBaseControl IO
का उदाहरण होना चाहिए। यह conduit
विशिष्ट चीज़ है।
CSV ByteString a
के लिए, हमें CSV
के उदाहरणों को खोजने की आवश्यकता है। ऐसा करने के लिए, http://hackage.haskell.org/packages/archive/csv-conduit/0.2.1.1/doc/html/Data-CSV-Conduit.html#t:CSV पर जाएं (जहां पैकेज के लिए प्रलेखन मेरी राय में कुछ हद तक अपमानजनक रूप से टाइपक्लास में भरा हुआ है ...) और उदाहरणों पर क्लिक करें कि हमारे पास CSV ByteString a
फ़ॉर्म के उपलब्ध उदाहरण क्या हैं। दो विकल्प CSV ByteString ByteString
और CSV ByteString Text
हैं।
इनमें से दो में से Text
बेहतर है क्योंकि यह यूनिकोड को नियंत्रित करता है और सीएसवी बाइनरी डेटा युक्त होने की संभावना नहीं है। ByteString
[Word8]
के समान या कम है जबकि Text
[Char]
के समान है जो शायद आप चाहते हैं। इसलिए, a
Text
होना चाहिए (हालांकि ByteString
अभी भी काम करेगा)।
इसका मतलब है कि फ़ंक्शन कॉल का परिणाम ResourceT IO [Row Text]
है। हम इसके साथ बहुत कुछ नहीं कर सकते हैं, लेकिन ResourceT
एक मोनड ट्रांसफार्मर है, हम आसानी से मोनैड ट्रांसफ़ॉर्मेशन परत को runResourceT
के साथ "पॉप" कर सकते हैं। इस प्रकार,
readFile :: FilePath -> IO [Row Text]
readFile = runResourceT . readCSVFile defCSVSettings
जो घेरे में मौजूद मुख्य आसानी से प्रयोग करने योग्य [Row Text]
पर प्राप्त करने के लिए जो आप तो अलग-अलग पंक्तियों पर अपने हाथों को पाने के लिए एक map
या एक fold
साथ अधिक पुनरावृति कर सकते हैं।
जीएचसीआई में इस तरह की चीज चलाने के लिए आपको बिल्कुल विशेष रूप से प्रकार को इंगित करना होगा। कारण यह है कि परिणाम वर्ग उदाहरण किसी भी पैरामीटर पर निर्भर नहीं है; इस प्रकार, CSVSettings
और FilePath
के किसी सेट के लिए, readCSVFile
विभिन्न प्रकार के किसी भी संख्या के रूप में लंबे m
MonadResource m
और a
का एक उदाहरण CSV ByteString a
का एक उदाहरण है के रूप में वे के रूप में लौट सकते हैं। इस प्रकार, हमें स्पष्ट रूप से जीएचसीआई को इंगित करना होगा जो आप चाहते हैं।
होना चाहिए 'readCsv :: स्ट्रिंग -> चार -> आईओ (V.Vector (पंक्ति B.ByteString))', पंक्ति बी के साथ की जगह पंक्ति पाठ ByteString – Janthelme