2012-01-07 10 views
34

what the Comonad typeclass is in Haskell के बारे में कुछ विचार रखने के बाद, मैंने स्टोर कॉमोनैड के बारे में सुना है। लेकिन Control.Comonad.Store.Lazy पर देखकर, मुझे वास्तव में यह नहीं मिलता है। इसका क्या मतलब है? ये किसके लिये है? मैंने सुना है कि स्टोर = CoState, राज्य Monad के दोहरे। इसका क्या मतलब है?स्टोर कॉमोनड क्या है?

उत्तर

30

यदि आप StoreT itself की परिभाषा को देखते हैं तो यह बहुत आसान है।

आप इसे एक बड़ी संरचना में "स्थान" के रूप में सोच सकते हैं। उदाहरण के लिए, lens बस a -> Store b a है; आपको बी फ़ील्ड का मान मिलता है, और एक नया मान वापस बड़े संदर्भ में रखने के लिए b -> a पर फ़ंक्शन मिलता है।

अपनी सरल, गैर ट्रांसफार्मर रूप में यह ध्यान में रखते हुए:

data Store s a = Store (s -> a) s 

instance Functor (Store s) where 
    fmap f (Store g s) = Store (f . g) s 

instance Extend (Store s) where 
    duplicate (Store f s) = Store (Store f) s 

instance Comonad (Store s) where 
    extract (Store f s) = f s 

यानी duplicate बदल जाता है एक s -> Store s a कि सिर्फ मूल्य बदलने के बाद "अद्यतन" जगह रिटर्न में s -> a, और extract मूल एक पुनर्स्थापित करता है मूल्य को वापस बड़े ढांचे में रख कर

जहां तक ​​राज्य के साथ उसके संबंध हो जाता है, तो आप इस तरह इसे देख सकता है:

type State s a = s -> (a, s) 
type Store s a = (s -> a, s) 
+15

बस राज्य और स्टोर के बीच कनेक्शन पर विस्तार करने के लिए, सभी monads आसन्न functors की संरचना से उत्पन्न होता है। यह आमतौर पर ज्ञात है कि मकानकारियों '(आर -> _) '(उर्फ रीडर) और' (_, आर) '(फ़्लिप किए गए काम भी हैं, लेकिन हास्केल में राज्य की सामान्य प्रस्तुति में फिट नहीं हैं, और यह नहीं हो सकता हास्केल में फंक्टर इंस्टेंस) निकट हैं, और यदि आप उन्हें एक तरह से लिखते हैं ('s -> (_, s)') आपको एक मोनड मिलेगा, और यदि आप उन्हें दूसरी तरफ लिखते हैं ('(s -> _, एस) ') आप एक कॉमोनड प्राप्त करेंगे। – copumpkin

+0

@ कॉपम्पकिन: यह '(_, आर) 'है जो एक फंक्टर नहीं हो सकता है, है ना? '(आर, _)' सिर्फ 'उदाहरण फंक्शन ((,) आर) 'है। – ehird

+0

हाँ, क्षमा करें, मैंने उस मूलभूत टिप्पणी को गलत तरीके से संपादित किया :) – copumpkin

33

दुकान के निम्नलिखित परिभाषा को देखते हुए,

data Store s a = Store { peek :: s -> a, pos :: s } 

मैं एक Store के रूप में के बारे में सोचना चाहते a प्रकार के मूल्यों से भरा एक बड़ा गोदाम। a के प्रत्येक मान को s के इंडेक्स मान द्वारा लेबल की गई स्थिति में रखा गया है। अंत में pos पर पार्क किया गया फोर्कलिफ्ट है। फोर्कलिफ्ट का इस्तेमाल extract पर किया जा सकता है, जहां से इसे पार्क किया गया है, वहां से मूल्य खींचकर स्टोर से a का मूल्य। फ़ोर्कलिफ्ट को एक नई पूर्ण स्थिति में स्थानांतरित करने के लिए seek का उपयोग कर सकते हैं या फोर्कलिफ्ट को एक नए सापेक्ष स्थान पर ले जाने के लिए seeks का उपयोग कर सकते हैं। स्टोर के सभी मूल्यों को अद्यतन करने के लिए fmap का उपयोग करें। अंत में extend ffmap के समान है f :: a -> a' के बजाय हमारे पास f :: Store s a -> a' है जो अद्यतन फ़ंक्शन को केवल अद्यतन होने वाले मूल्य तक पहुंच नहीं देता है बल्कि स्टोर की स्थिति तक पहुंच प्रदान करता है और स्टोर में अन्य सभी चीज़ों के मूल्य तक पहुंच प्रदान करता है। दूसरे शब्दों में, extend अद्यतन करने के लिए मूल्य और उसके आस-पास के संदर्भ का उपयोग करता है।

एक और कम्प्यूटरी समरूपता Store को हार्ड डिस्क की एक बड़ी प्लेटर के रूप में विभिन्न पदों पर संग्रहीत मूल्यों के साथ, और एक विशेष स्थिति में पार्क किए गए सिर के साथ सोचने के लिए होगी।

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