2013-02-22 19 views
11

monads के बारे में पढ़ने में, मैं "Xyz monad में computations" जैसे वाक्यांश देख रहा हूं। गणना के लिए एक निश्चित मोनैड "इन" होने का क्या अर्थ है?हास्केल: गणना "एक मोनड में" - जिसका अर्थ है?

मुझे लगता है कि मेरे पास मोनैड के बारे में एक उचित समझ है: कंप्यूटेशंस को आमतौर पर कुछ अपेक्षित प्रकार के आउटपुट उत्पन्न करने की इजाजत मिलती है, लेकिन वैकल्पिक रूप से या अतिरिक्त रूप से कुछ अन्य जानकारी जैसे कि त्रुटि स्थिति, लॉगिंग जानकारी, राज्य और इतने पर, और इस तरह के computations जंजीर होने की अनुमति दें।

लेकिन मुझे नहीं लगता कि गणना एक मोनैड में "इन" कैसे कहा जाएगा। क्या यह सिर्फ एक समारोह का संदर्भ देता है जो एक monadic परिणाम पैदा करता है?

उदाहरण: ("में गणना" खोज)

+0

आजकल मैं इन्हें * क्रिया * या * कम्प्यूटेशंस * के रूप में संदर्भित करना पसंद करता हूं। यदि वे किसी फ़ंक्शन द्वारा उत्पादित होते हैं, तो आप पैरामीट्रिक क्रियाओं या मोनैडिक फ़ंक्शंस के बारे में बात कर सकते हैं, लेकिन बाद वाला शब्द संदिग्ध है। यह 'a -> m b' का संदर्भ ले सकता है, लेकिन' m (a -> b) 'के लिए भी। चूंकि इस आखिरी व्यक्ति को आवेदक शैली में उपयोग किया जाता है, इसलिए मैं कम अस्पष्ट शब्द पसंद करता हूं। – ertes

+0

सुनिश्चित करें कि नीचे सी। मैककन का जवाब याद न करें। – ertes

उत्तर

11

आम तौर पर, एक "एक इकाई में गणना" न केवल एक एक monadic परिणाम लौटने या दूसरा तर्क के भाग के रूप (>>=) करने के लिए या समारोह है, लेकिन इस तरह के एक एक do ब्लॉक के अंदर इस्तेमाल किया समारोह, कुछ भी उन लोगों के लिए किसी और बराबर का मतलब है। भेद कुछ टिप्पणी के लिए प्रासंगिक है जो आपने टिप्पणी में कहा था:

"गणना" इनपुट मोनैड से निकाले गए वैल के बाद func f में होता है, और इससे पहले परिणाम मोनाड के रूप में लपेटा जाता है। मैं नहीं देखता कि गणित प्रति से "मोन" में कैसे है; यह मोनैड के "बाहर" लगता है।

यह एक बुरा जिस तरह से यह के बारे में सोचना नहीं है - वास्तव में, do अंकन इसके द्वारा प्रोत्साहित क्योंकि यह एक सुविधाजनक तरीका चीजों को देखने की है - लेकिन यह एक थोड़ा भ्रामक अंतर्ज्ञान में परिणाम है। कहीं भी एक मोनड से "निकाला" नहीं जा रहा है। यह देखने के लिए, (>>=) को भूलें - यह एक समग्र ऑपरेशन है जो do नोटेशन का समर्थन करने के लिए मौजूद है।

fmap :: (a -> b) -> (m a -> m b) 
return :: a -> m a 
join :: m (m a) -> m a 

... जहां m एक इकाई है: एक इकाई के अधिक मौलिक परिभाषा तीन orthogonal कार्य हैं। प्रकार m a और a -> m b के तर्कों के साथ शुरू, अपने ही एकमात्र विकल्प fmap का उपयोग कर प्रकार m (m b) के बारे में कुछ पाने के लिए किया जाता है, जिसके बाद आप join उपयोग कर सकते हैं करने के लिए नेस्टेड "परत" समतल:

अब कैसे के साथ इन (>>=) को लागू करने के बारे में सोचते हैं बस m b प्राप्त करें।

दूसरे शब्दों में, कुछ भी नहीं इकाई के "बाहर" ले जाया जा रहा है - इसके बजाय, इकाई में गहरी जा रहा है, लगातार चरणों इकाई की एक परत में ढह किया जा रहा है के रूप में गणना के बारे में सोच।

ध्यान दें कि मोनैड कानून इस परिप्रेक्ष्य से भी अधिक सरल हैं - अनिवार्य रूप से, वे कहते हैं कि जब join लागू होता है तब तक कोई फर्क नहीं पड़ता जब तक घोंसले का आदेश संरक्षित नहीं होता है (सहयोगीता का एक रूप) और यह कि मोनाडिक परत return द्वारा पेश किया गया कुछ भी नहीं (join के लिए पहचान मान)।

+0

इस चर्चा के लिए धन्यवाद, जिसने कुछ हेडवे उत्पादित किए :-)। इस चरण में, अपनी चर्चा पढ़ने में, मुझे लगता है कि मैं इस बात पर स्पष्ट नहीं हूं कि वास्तव में "मोनैड" क्या है (कुछ परतें और गहराई है?), एक परिदृश्य में जिसमें प्रत्येक वापसी संभवतः कई कार्यों को शामिल करती है monadic मूल्य, fmap और शामिल होने, और उनके अपने monadic परिणामों की मदद से बना है। – gwideman

+1

@gwideman: सख्त अर्थ में, हास्केल में "एक मोनड" गणितीय संरचना है जो एक प्रकार के कन्स्ट्रक्टर द्वारा वर्णित है और 'एफएमएपी', 'रिटर्न', और 'जॉइन' के उचित कार्यान्वयन और "मोनैड" विशिष्ट होगा टाइप कन्स्ट्रक्टर और इंस्टेंस पर चर्चा की जा रही है। प्रैक्टिस में, शब्द कन्स्ट्रक्टर और/या उनके साथ बनाए गए मानों से जुड़े डेटा कन्स्ट्रक्टर को संदर्भित करने के लिए अक्सर थोड़ा सा दुर्व्यवहार किया जाता है। –

+0

मेरा निष्कर्ष: "Xyz Monad" में "गणना" का अर्थ है "कार्यों में गणना जो Xyz प्रकार के मान लौटाती है, जिसमें Xyz Monad उदाहरण के fmap/return/join विधियों का उपयोग करके एकत्रित किए गए कार्यों के साथ"। – gwideman

0

IO इकाई पर विचार करें। IO a प्रकार का एक व्यवहार एक बड़ी (अक्सर अनंत) व्यवहार का वर्णन है जहां व्यवहार आईओ घटनाओं का एक अनुक्रम है (पढ़ता है, लिखता है, आदि)। इस तरह के मूल्य को "गणना" कहा जाता है; इस मामले में यह IO मोनड में गणना है।

+0

यह वास्तव में इस तरह की टिप्पणी का एक उदाहरण है जिसमें मुझे समझ में नहीं आता कि "इन" की तैयारी कैसे लागू होती है। – gwideman

+0

वैसे हमें दो संज्ञा वाक्यांशों "गणना" और "आईओ मोनैड" को गठबंधन करने की आवश्यकता है। अंग्रेजी में केवल सीमित संख्या में प्रीपोज़िशन हैं। "इससे संबंधित" "इन" से अधिक समझ में आ सकता है। –

11

क्या यह सिर्फ एक ऐसे फ़ंक्शन का संदर्भ देता है जो एक monadic परिणाम उत्पन्न करता है?

हां, संक्षेप में।


लंबे में, यह क्योंकि Monad आप इसे (return के माध्यम से) में मूल्यों सुई लेकिन एक बार Monad अंदर वे समस्या आ रही अनुमति देता है। आपको evalWriter या runCont जैसे कुछ फ़ंक्शन का उपयोग करना होगा जो मूल्यों को "आउट" मानने के लिए Monad से सख्ती से अधिक विशिष्ट है।

उससे अधिक, Monad (वास्तव में, इसके साथी, Applicative) "कंटेनर" रखने का सार है और इसके अंदर गणना करने की अनुमति है। (>>=) आपको Monad "अंदर" दिलचस्प कंप्यूटेशंस करने की क्षमता देता है।

तो Monad m => m a -> (a -> m b) -> m b जैसे फ़ंक्शंस आपको Monad के साथ और उसके आस-पास की गणना करने दें। Monad m => a -> m a जैसे कार्य आपको Monad में इंजेक्ट करने देते हैं। m a -> a जैसे कार्य आपको Monad से "भागने" देंगे, सिवाय इसके कि वे सामान्य रूप से मौजूद नहीं हैं (केवल विशिष्ट में)। इसलिए, बातचीत के लिए हम उन कार्यों के बारे में बात करना पसंद करते हैं जिनके परिणाम Monad m => m a जैसे "मोनैड के अंदर" हैं।

+0

धन्यवाद। "वार्तालाप के लिए" सुझाव "मोनैड में" भाषण का अस्पष्ट चित्र है, लेकिन मैं काफी संतुष्ट नहीं हूं। "funcs की तरह तो >> = [...] वापसी ..." मेरे मुसीबत: >> = और श्रृंखला कार्यों कि गैर monadic मानों को लेकर monadic मान लौट: (समारोह आउटपुट monadic मूल्य) -> (का उपयोग करके संलग्न वैल निकालें >> =) -> (func f में प्रक्रिया वैल) -> (मोनड में लपेटें)। "गणना" इनपुट मोनैड से निकाले गए वैल के बाद func f में होती है, और इससे पहले परिणाम मोनाड के रूप में लपेटा जाता है। मैं नहीं देखता कि गणित प्रति से "मोन" में कैसे है; यह मोनैड के "बाहर" लगता है। – gwideman

+0

@gwideman कुछ इस बारे में सोचने के लिए: आपके उदाहरणों में से एक जो आपने लिंक किया है, एक राज्य मोनैड का उपयोग करता है, जो एक उदाहरण है जहां बांध वास्तव में रचना है: यह कुछ प्रारंभिक अवस्था में अंततः "रन" होने के लिए एक राज्यव्यापी गणना का निर्माण कर रहा है। – jberryman

+0

मैं कहूंगा कि वे "मोनैड में" हैं (1) वे "बाहरी" और (2) को पकड़ने के लिए कभी भी आपके लिए एक नंगे मूल्य वापस नहीं करते हैं, जब आप उन्हें '>> =' के साथ बाध्य करते हैं तो आप मूल रूप से उन्हें 'मोनाड' में इंजेक्शन देना और फिर परतों को एक साथ वापस विलय करने के लिए 'join :: Monad m => m (ma) -> ma' का उपयोग करना। –

3

उदाहरण के तौर पर "संग्रह-जैसे" मोनैड से शुरू करते समय आम तौर पर मोनैड सामान को समझना आसान होता है। कल्पना कीजिए कि आप दो अंक की दूरी की गणना:

data Point = Point Double Double 

distance :: Point -> Point -> Double 
distance p1 p2 = undefined 

अब आप एक निश्चित संदर्भ हो सकता है। जैसे अंक में से एक "अवैध" हो सकता है क्योंकि यह कुछ सीमाओं से बाहर है (उदा। स्क्रीन पर)।तो तुम Maybe इकाई में अपने मौजूदा गणना लपेट:

distance :: Maybe Point -> Maybe Point -> Maybe Double 
distance p1 p2 = undefined 

आप बिल्कुल वैसा ही गणना है, लेकिन अतिरिक्त सुविधा के साथ वहाँ "कोई परिणाम" (Nothing के रूप में एन्कोड) हो सकता है।

या आपके पास "संभावित" बिंदुओं के दो समूह हैं, और उनकी पारस्परिक दूरी की आवश्यकता है (उदाहरण के लिए बाद में सबसे कम कनेक्शन का उपयोग करें)। तब सूची इकाई अपने "संदर्भ" है:

distance :: [Point] -> [Point] -> [Double] 
distance p1 p2 = undefined 

या अंक एक उपयोगकर्ता है, जो गणना "गैर नियतात्मक" (अर्थ में है कि आप बाहर की दुनिया में चीजों पर निर्भर करता है, जो बदल सकते हैं द्वारा दर्ज की जाती हैं), तो IO इकाई अपने दोस्त है:

distance :: IO Point -> IO Point -> IO Double 
distance p1 p2 = undefined 

गणना हमेशा एक ही रहता है, लेकिन एक निश्चित "संदर्भ" है, जो कुछ उपयोगी पहलुओं कहते हैं में जगह लेने के लिए होता है (विफलता, बहु मूल्य, nondeterminism) । आप इन संदर्भों (मोनैड ट्रांसफार्मर) को भी जोड़ सकते हैं।

आप एक परिभाषा है कि परिभाषाओं ऊपर सम्मिलित है लिख सकते हैं, और लिए काम करता है किसी भी इकाई:

distance :: Monad m => m Point -> m Point -> m Double 
distance p1 p2 = do 
    Point x1 y1 <- p1 
    Point x2 y2 <- p2 
    return $ sqrt ((x1-x2)^2 + (y1-y2)^2) 

साबित होता है कि हमारे गणना वास्तव में स्वतंत्र वास्तविक इकाई है, जो के रूप में योगों की ओर जाता है से है "एक्स y-monad (-side) में गणना की जाती है"।

+0

प्रयास के लिए धन्यवाद, लेकिन मुझे नहीं पता कि यह प्रश्न मेरे प्रश्न पर कहां है। दो उदाहरण जहां आप "इन" पर चर्चा करते हैं, मुझे समझ में नहीं आता है, लेकिन शायद मुझे कुछ याद आया। विशेष रूप से: "तो आप शायद अपने मोनैड में मौजूदा गणना को लपेटें"। (ए) यह गणना दूरी की गणना नहीं करती है, यह बस अपरिभाषित लौटती है, इसलिए मुझे यकीन नहीं है कि क्या दिखाया जा रहा था। (बी) यह एक मोनैड में "गणना गणना" नहीं करता है, यह केवल निर्दिष्ट करता है कि इनपुट और आउटपुट मान शायद प्रकार के होने के लिए बाध्य हैं, जो उपयुक्त परिभाषाओं को शामिल करते हुए मोनाड के रूप में प्रदर्शन कर सकते हैं ... – gwideman

+0

[cont'd] हालांकि इस उदाहरण में क्षमता का उपयोग नहीं किया जा रहा है। "यह साबित करता है कि हमारी गणना वास्तविक मोनैड से वास्तव में स्वतंत्र है, जो फॉर्मूलेशन की ओर ले जाती है" x को y monad में (-side) में गणना की जाती है। यह एक गैर-अनुक्रमक की तरह लगता है। यदि गणना स्वतंत्र है मोनैड, यह कैसे दर्शाता है कि गणना मोनैड के अंदर है? – gwideman

+1

(ए) मैं टाइप करने के लिए बहुत आलसी था। मैंने सोचा था कि आप जानते हैं कि इसे कैसे कार्यान्वित किया जाए (और अंतिम कोड ब्लॉक में एक कार्यान्वयन है जो विशिष्ट के लिए काम करेगा monads, भी) (बी) आप ** एक मोनैड में मुद्रित मूल्यों के साथ काम कर रहे हैं, लेकिन जैसा कि मैंने इसे दिखाने की कोशिश की है, यह गणना गणना को प्रभावित नहीं करती है। इससे बाहरी मोनड अदला-बदली करने योग्य बनाता है, जो इसे बदले में बदल देता है इसके बारे में बात करते समय किसी भी तरह इसका जिक्र करें। यदि आपकी गणना 'हो सकता है' जैसे किसी निश्चित मोनैड की ओर "हार्डकोडेड" थी, तो आप उस तथ्य को तनाव देने के लिए परेशान नहीं होंगे। – Landei

1

आपके द्वारा प्रदान किए गए लिंक को देखते हुए, ऐसा लगता है कि "गणना" का एक आम उपयोग एक ही monadic मूल्य के संबंध में है। कुछ अंशः

सौम्य परिचय - यहाँ हम एस.एम. इकाई में एक गणना चलाते हैं, लेकिन गणना monadic मूल्य है:

-- run a computation in the SM monad 
runSM     :: S -> SM a -> (a,S) 

सभी monads के बारे में - पिछले गणना अनुक्रम में एक monadic मूल्य को संदर्भित करता है :

>> समारोह एक सुविधा ऑपरेटर है कि एक monadic गणना कि अनुक्रम में पिछले गणना से इनपुट की आवश्यकता नहीं है बाध्य करने के लिए प्रयोग किया जाता है

monads को समझना - यहां पहले गणना उदा। getLine, एक monadic मूल्य:

(बंधन) एक और गणना में एक गणना के परिणाम का उपयोग कर, चल संगणना की एक धारणा की आवश्यकता के बिना की एक आंतरिक विचार देता है।

तो एक सादृश्य के रूप में, अगर मैं i = 4 + 2 कहते हैं, तो i मूल्य 6 है, लेकिन यह भी उतना ही एक अभिकलन, अर्थात् गणना 4 + 2 है। ऐसा लगता है कि जुड़े हुए पृष्ठ गणना इस अर्थ में उपयोग करते हैं - कम से कम कुछ समय के रूप में गणना - इस मामले में दिए गए मोनैड में "गणना" अभिव्यक्ति का उपयोग करने के लिए यह समझ में आता है।

+0

टिप्पणियों के लिए धन्यवाद Boris। सवाल "[कुछ] मोनैड में गणना" के बारे में था, न केवल "गणना"। प्रत्येक संदर्भित लिंक में पूर्व के कई उदाहरण हैं। – gwideman

संबंधित मुद्दे