2013-03-21 8 views
5

अच्छे दिन के लोगों में बाध्यकारी monads। मैं कृपया monads पर कुछ स्पष्टीकरण मांग रहा हूं और बांध का उपयोग कर रहा हूं (कृपया एक समग्र . में जाकर)।कंपोजिट्स (हास्केल)

तो इस उदाहरण के लिए

:

--Monadic parts: 
readFile :: String -> IO File 
putStr :: String -> IO() 
-- Non monadic parts 
toMatrix :: String -> CustomMatrix 
toString :: CustomMatrix -> String 

अनिवार्य रूप से मैं lazily एक फ़ाइल (readFile) तो, एक कस्टम मैट्रिक्स उत्पादन एक स्ट्रिंग उत्पादन के लिए मैट्रिक्स परिवर्तित पढ़ रहा हूँ। फिर लौट रहा है।

fileReading :: String -> IO 
fileReading file = putStr(toString . toMatrix . readFile file) 

यह वह जगह है जब मैं बाँध >>= का उपयोग कर readFile file से जाना द्वारा एक मेस बनाने लगते हैं। क्या कोई तरीका है कि मैं . कंपोजिट्स का उपयोग करना जारी रख सकता हूं और बिना पढ़े हुए गड़बड़ किए बिना बाध्य और लिख सकता हूं (वास्तव में मेरा उद्देश्य नहीं)।

हमेशा की तरह, किसी भी मदद की आभारी रूप से प्राप्त की जाती है। धन्यवाद दोस्तों

+2

परिवर्तनीय और फ़ंक्शन नाम अंक से शुरू नहीं हो सकते हैं, इसलिए मैं आपके प्रश्न में '2 मैट्रिक्स' और '2 स्ट्रिंग' नाम बदल रहा हूं। – dave4420

+0

क्षमाप्रार्थी। मैं सोचने के बिना अपने फंक्शन नाम कम कर रहा था। – BrownE

+1

कुछ monad 'm' के लिए 'a -> m b' प्रकार के कार्यों के लिए' (।) 'के समानता को' (<= <) '(' Control.Monad' से) कहा जाता है और इसे क्लेस्ली संरचना कहा जाता है। आप जो लिख रहे हैं उसके प्रकारों के आधार पर आप इसे '.' के साथ मिश्रित कर सकते हैं। जैसे 'fileReading = putStr। तार । toMatrix <= luqui

उत्तर

7

आप इस उदाहरण में कुछ मोनैडिक फ़ंक्शन (जैसे >>=) का उपयोग किए बिना दूर नहीं जा सकते हैं। यदि आप वास्तव में कुछ आईओ करने को समाप्त करना चाहते हैं तो आप आईओ मानों के साथ सामान्य फ़ंक्शन संरचना का उपयोग नहीं कर सकते हैं।

सौभाग्य से, आप अभी भी कोड काफी readably लिख सकते हैं:

fileReading file = readFile file >>= putStr . toString . toMatrix 

यह काम करता है क्योंकि दो . संचालन के लिए एक अंतिम आईओ समारोह के साथ दो गैर आईओ कार्यों गठबंधन। उस बिंदु पर, आपके पास दो आईओ मान हैं: IO String और String -> IO() फ़ंक्शन (संपूर्ण putStr . toString . toMatrix अभिव्यक्ति उस प्रकार है)। यह वास्तव में >>= लेता है, इसलिए आप सभी सेट हैं।

आप कोड के रूप में ऊपर एक ही आदेश करना चाहते हैं, तो आप पीछे की ओर बाँध ऑपरेटर का उपयोग कर सकते हैं: क्योंकि कोड के सभी "बहती है" एक ही में

fileReading file = putStr . toString . toMatrix =<< readFile file 

कुछ लोगों को इस संस्करण अधिक पठनीय लगता है दिशा।