2015-03-18 7 views

उत्तर

13

कुछ नहीं है यह विचार है कि हास्केल में एक बीजीय डेटाप्रकार का एक मूल्य के रूप

C x_1 x_2 ... x_n 

जहां C एक निर्माता है और x_i हैं है तर्क क्या

gfoldl app con 

करता

con C `app` x_1 `app` x_2 ... `app` x_n 

में इस तरह के एक मूल्य के चालू करने के लिए इस तरह एक c a में एक a मोड़ है। मान लेते हैं C के प्रकार

C :: T_1 -> T_2 -> ... -> T_n -> D 
तो के मध्यवर्ती भाव के प्रकार को देखो

है करते हैं:

con C         :: c (T_1 -> T_2 -> ... -> T_n -> D) 
con C `app` x_1       :: c (T_2 -> ... -> T_n -> D) 
con C `app` x_1 `app` x_2    :: c (... -> T_n -> D) 
con C `app` x_1 `app` x_2 ... `app` x_n :: c D 

parameterization c पर इन सभी मध्यवर्ती प्रकार अलग होने की अनुमति देता है। अगर हम इसके बजाय gfoldl' जैसे साधारण फोल्ड का उपयोग करेंगे, तो सभी इन मध्यवर्ती प्रकारों को समान होना होगा।

gfoldl के लिए प्रेरणा एक एकल सामान्यीकरण आप SYB कार्यों gmapQ और gmapT (और कुछ अन्य लोगों) को व्यक्त करने देता है कि हो रहा है। gmapQ और gmapT के प्रकार हैं:

gmapQ :: Data a => (forall d. Data d => d -> u) -> a -> [u] 
gmapT :: Data a => (forall b. Data b => b -> b) -> a -> a 

जबकि gmapQu रों के एक समान सूची में एक a गिर और gfoldl' का उपयोग कर व्यक्त किया जा सकता है, इस gmapT के लिए संभव नहीं होगा।

हालांकि, gfoldl के साथ, हम कुछ gmapT की तरह है, और c = ConstgmapQ की तरह कुछ पाने के लिए प्राप्त करने के लिए हमें सक्षम करने के लिए c = Identity उपयोग कर सकते हैं।

अधिक जानकारी के लिए, आप भी कागज Scrap your boilerplate Reloaded जो दिखाता है कि gfoldl एक साधारण (अभी तक उच्च क्रम) है पर देखने के एक डेटा-प्रकार है कि उस पत्र में Spine कहा जाता है की गुना कर सकते हैं।

पहचान और निरंतर functors के उपयोग के लिए एक एकल अंतर्निहित प्रतिनिधित्व से दोनों रूपांतरित होने वाले और अद्यतन करने व्यवहार प्राप्त करने के लिए कैसे आप "वैन Laarhoven" लेंस से लेंस संचालन प्राप्त करने के लिए कुछ समानता है।

+0

"सी 'पर पैरामीटरकरण इन सभी मध्यवर्ती प्रकारों को अलग करने की अनुमति देता है" - क्या आप विस्तृत कर सकते हैं? यह वास्तव में स्पष्ट समझ में नहीं आता है। – leftaroundabout

+0

@ बाएंअराउंडबाउट 'gfoldl' में सभी 'सी एक्स' घटनाएं 'आर' हैं, यानी, वे सभी एक ही प्रकार के होते हैं। 'सी एक्स' के साथ, मैं अभी भी उन सभी का एक ही प्रकार हो सकता हूं, जैसे 'कॉन्स्ट आर एक्स' में जो 'आर'' के लिए आइसोमोर्फिक है। लेकिन मैं उन्हें सभी अलग-अलग भी कर सकता हूं, जैसे उदा। 'पहचान एक्स' में जो 'एक्स' के लिए isomorphic है। – kosmikus

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