2013-06-10 9 views
10

According to the Haskell wikibook, एक Monad बुलाया m दो अतिरिक्त कार्यों के साथ एक Functor है:यह एक मोनड नहीं है, लेकिन यह क्या है?

unit :: a -> m a 
join :: m (m a) -> m a 

यह अच्छा है, लेकिन मैं कुछ अलग है। गोररी विवरणों पर चमकते हुए, मेरे पास एक प्रकार है जिसमें unit और join फ़ंक्शन हैं, लेकिन इसकी fmap अच्छी तरह से व्यवहार नहीं किया गया है (fmap g . fmap f आवश्यक नहीं है fmap (g.f))। इस वजह से, इसे Monad का उदाहरण नहीं बनाया जा सकता है। फिर भी, मैं इसे जितना संभव हो उतना सामान्य कार्यक्षमता देना चाहता हूं।

तो मेरा सवाल यह है कि, किस श्रेणी में सैद्धांतिक संरचनाएं मोनैड के समान हैं, जिनमें उनके पास unit और join है?

मुझे एहसास है कि कुछ स्तर पर, उपर्युक्त प्रश्न खराब परिभाषित है। मोनैड के लिए unit और join परिभाषाएं केवल fmap परिभाषा के संदर्भ में समझ में आती हैं। fmap के बिना, आप किसी भी मोनैड कानून को परिभाषित नहीं कर सकते हैं, इसलिए unit/join की किसी भी परिभाषा समान रूप से "मान्य" होगी। तो मैं fmap के अलावा अन्य कार्यों की तलाश में हूं कि इन unit और join फ़ंक्शंस पर कुछ "नॉन-मोनैड" कानूनों को परिभाषित करने का अर्थ हो सकता है।

+5

आप संरचना आप के बारे में अधिक वर्णन कर सकते है, और क्या खास कारणों में इसके लिए संलयन कानून विफल 'fmap'? – luqui

+2

मुझे लगता है कि आप विशेष रूप से "tweaked" 'fmap' को इस तरह से बदलते हैं ताकि 'शामिल' दूसरे मोनैड कानून को पूरा कर सके? आम तौर पर, आप लगभग हमेशा 'fmap जी मिलता है। fmap f ≡ fmap $ f.g' बस स्वचालित रूप से। – leftaroundabout

+0

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

उत्तर

3

वैसे यहां एक कानून है जो आपको unit और join के साथ होना चाहिए। x :: m a को देखते हुए,

join (unit x) = x 

दिखाने के लिए कि यह सिर्फ कहीं से नहीं आया था, के लिए एक मौजूदा इकाई कानून के साथ शुरू करते हैं:

return x >>= f = f x 

यह देखते हुए कि m >>= f = join (fmap f m)

join (fmap f (return x)) = f x 

f = id

0 का चयन करें
join (fmap id (return x)) = id x 

functor कानून का उपयोग करें कि fmap id = id

join (id (return x)) = id x 

उपयोग स्पष्ट id a = a

join (return x) = x 
संबंधित मुद्दे