2009-10-03 8 views
7

लागू: मैं इसके बारे में पढ़ा है, मुझे यह समझ, और फिर मैं इसे यकीन है कि मैं वास्तव में प्राप्त करने के लिए कुछ उदाहरण ऊपर कोड।देख: जब नई प्रोग्रामिंग विषयों के बारे में सीखने मैं आमतौर पर एक पैटर्न का पालन इन monads

मैंने monads के बारे में बहुत कुछ पढ़ा है, और मुझे विश्वास है कि मैं समझता हूं और उन्हें प्राप्त करता हूं। अब मैं एक मंच पर हूं जहां मैं वास्तव में अपनी समझ को मजबूत करने के लिए कुछ monads को कोड करना चाहता हूं, और वास्तव में विभिन्न प्रकार के लिए बाइंड को लागू करने के लिए क्या लगता है।

समस्या यह है कि मैं लागू करने के लिए कई स्पष्ट monads के बारे में नहीं सोच सकता, इसलिए मैं सिफारिशों की तलाश में हूं। अधिमानतः, मुझे कुछ आसान लोगों के साथ सिफारिशों की एक सूची चाहिए और कुछ आसान नहीं हैं।

मुझे यह भी एहसास है कि मोनैड का उपयोग कार्यात्मक कार्यक्रमों में दुष्प्रभावों को 'encapsulate' करने के लिए किया जाता है, लेकिन वे उससे भी अधिक सामान्य होते हैं। इसलिए, मैं सिफारिशों को मोनैड शामिल करना चाहता हूं जो दोनों साइड इफेक्ट्स और कुछ सामान्य लोगों को समाहित करते हैं।

धन्यवाद!

(एक साइड नोट के रूप में: मैं ऐसा करने के लिए f # के साथ काम कर रहा हूं, लेकिन मुझे लगता है कि यह प्रश्न किसी भी कार्यात्मक भाषा पर लागू हो सकता है)।

उत्तर

5

मुझे लगता है कि All About Monads में कैटलॉग एक अच्छी शुरुआत है (निरंतरता मोनैड वास्तव में catamorphisms के लिए उपयोगी है, उदाहरण के लिए here); इसके अतिरिक्त parsers, और संभवतः transactional effectsAsync अपने आप को लागू करने का प्रयास करने के लिए एक और अच्छा है (तार्किक रूप से एकल-थ्रेडेड कोड जो विभिन्न वास्तविक धागे में गैर-अवरुद्ध होने के लिए होप्स करता है)।और Reactive Framework का अंतर्निहित मोनड एक अच्छी उन्नत चुनौती की तरह दिखता है।

2

किसी प्रकार के मोनैडिक कानून का पालन करने वाले डेटास्ट्रक्चर/कम्प्यूटेशंस की सूची बेहद समृद्ध है।

यह वैकल्पिक डेटा पर सूची (एफ # में 'a option) से पहुंचता है, निरंतरता और पारसर्स की तरह अत्यधिक जटिल बातें करने के लिए multithreading।

बस उनमें से कुछ को लागू करना शुरू करें। बेसिक exercies:

// Identity monad 

let something = ident { 
    let! value = id 42 
    return value 
} 

let somethingelse = ident { 
    let! value = something 
    let! otherValues = id 40 
    return value + othervalue 
} 


// Implement maybe for 'a option 
let sum = maybe { 
    let! a = maybeInputNumber("a") 
    let! b = maybeInputNumber("b") 
    let! c = maybeInputNumber("c") 
    return a + b + c 
} 

match sum with 
| None -> ... 
| Some(n) -> ... 

तुम भी सहायक कार्य करता है और स्पष्ट monadic वाक्य रचना के साथ एक litte सा खेल कर अपनी समझ को बढ़ा सकता है।

// Given m >>= f for m.Bind(f) 

let (>-) f monad = monad >>= (fun k -> return(f x)) 

// What's this? 
let res = ((+) 1) >- [1..10] 

आप कुछ जटिल उदाहरण चाहते हैं, monadic parser combinators पर एक नज़र डालें। यह (FParsec -Project पर एक नजर डालें) निम्नलिखित प्रकार पर

let parseVector = parser { 
    do! ignore $ char '(' 
    let! [x;y;z] = sepBy parseNumber "," 
    do! ignore $ char ')' 
    return new Vector(x, y, z) 
} 

इस के लिए एक सरल कार्यान्वयन आधारित है आप में सादे एफ # जटिल पुनरावर्ती डिसेंट पारसर्स लागू करने के लिए अनुमति देगा:

type 't Computation = 
    | Error of ... 
    | Result of 't 

type Input  = char list 
type 'a Parser = Input -> (('a * Input) Computation) 

करने की कोशिश करो बाँध और वापसी को लागू ;-)

और एक सामान्य टिप के रूप में: क्या तुम सच में उनके प्राकृतिक वातावरण में monads को समझने के लिए चाहते हैं, आप ' आपको Haskell का उपयोग करना होगा ;-) F # में केवल गणना संस्करण हैं, केवल एक अस्पष्ट एनालॉग है, लेकिन हास्केल किसी भी monadic गणना के लिए एक सामान्य इंटरफ़ेस प्रस्तुत करता है। उन्हें आजमाने के लिए बिल्कुल सही!

1

हालांकि मुझे लगता है कि हास्केल प्राकृतिक भाषा है जिसमें मोनैड के बारे में जानने के लिए, मुझे लगता है कि एक बहुत ही उपयोगी अभ्यास एक ऐसी भाषा में मोनैडिक कंप्यूटेशंस लाने के लिए है जो बॉक्स के बाहर नहीं है उनके लिए हास्केल जैसे सुपर चिकनी समर्थन। यह किसी भी भाषा में पूरी तरह से संभव है, और किसी भी उचित उच्च स्तर की भाषा में शायद रचनात्मक होना संभव होगा और वास्तव में उन्हें अच्छा लगेगा - प्रक्रिया में बहुत कुछ सीखना! मैंने पाइथन के लिए ठंडा मोनैडिक वाक्यविन्यास देखा है (उदाहरण के लिए, Valued Lessons पर, मुझे लगता है)।

क्लोजर की क्लोजर.contrib.monads लाइब्रेरी भी है जो लिस्प में मोनैड का उपयोग करने के लिए अच्छी सुविधाएं प्रदान करती है। इसके कुछ कार्यात्मक रूप से पुन: बनाने की कोशिश करना काफी निर्देशक हो सकता है। इसके अलावा, कभी-कभी हास्केल के स्थान पर इसका उपयोग सामान्य पैटर्न को हास्केल के सिंटैक्स के विवरण से अलग करने में सहायक हो सकता है (हालांकि वे काफी अच्छे हैं, सुनिश्चित करने के लिए)।