2011-11-29 14 views
21

Typeclassopedia का कहना है:।हास्केल functor निहित कानून

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

यदि ऐसा है, तो हम दूसरे मज़ेदार कानून का भी उल्लेख क्यों करते हैं?

Law 1: fmap id = id 
Law 2: fmap (g . h) = (fmap g) . (fmap h) 

उत्तर

19

जब मैं सबूत नहीं दे सकते, मुझे विश्वास है कि यह क्या कह रहा है कि parametricity के कारण, टाइप सिस्टम दूसरे कानून को तब तक लागू करता है जब तक कि पहले कानून के पास न हो। कारण दोनों नियमों को निर्दिष्ट करने के लिए है कि अधिक सामान्य गणितीय सेटिंग में, आप कुछ श्रेणी सी जहां वह खुद को सी से एक "मानचित्रण" को परिभाषित करने के लिए पूरी तरह से संभव है (Obj पर endofunctions की यानी एक जोड़ी हो सकता है (हैसी) और Hom (सी) क्रमशः) जो पहला नियम का अनुसरण करता है, लेकिन दूसरा नियम का पालन करने के लिए विफल रहता है, और इसलिए एक functor गठन करने के लिए विफल रहता है।

याद रखें कि हास्केल में Functor रों श्रेणी पर endofunctors Hask, और यहां तक ​​कि सब कुछ है कि गणितीय हास्केल में व्यक्त किया जा सकता Hask पर एक endofunctor पर विचार किया जाएगा नहीं ... किया जा रहा पैरामीट्रिक पोलिमोर्फ़िज्मके शासन बाहर की कमी कर रहे हैं एक मज़ेदार निर्दिष्ट करने में सक्षम है जो सभी वस्तुओं (प्रकारों) के लिए समान रूप से व्यवहार नहीं करता है।

this thread के आधार पर, आम सहमति यह प्रतीत होती है कि दूसरा कानून हास्केल Functor उदाहरणों के लिए पहले से आता है।एडवर्ड Kmett says,

fmap id = id को देखते हुए, fmap (f . g) = fmap f . fmap gFMAP के लिए मुफ्त प्रमेय से इस प्रकार है।

यह लंबे समय से एक पेपर में एक तरफ के रूप में प्रकाशित हुआ था, लेकिन मैं कहां भूल गया।

+1

मुफ्त प्रमेय से दूसरे फ्नक्टर कानून में जाने के लिए यहां एक और विस्तृत लेखन है, https://github.com/quchen/articles/blob/master/second_functor_law.md – David

+0

@ डेविड एक टाइपो है : "फ्नक्टर" -> "फंक्टर" – fans656

3

मैं कहेंगे दूसरे नियम वैधता कारणों के लिए उल्लेख नहीं है, बल्कि एक महत्वपूर्ण संपत्ति के रूप में:

पहले कानून का कहना है कि एक कंटेनर में हर आइटम से अधिक पहचान समारोह मानचित्रण इसका कोई प्रभाव नहीं है। दूसरा कहता है कि एक कंटेनर में प्रत्येक आइटम पर दो कार्यों की संरचना मैपिंग है जो पहले एक मैपिंग मैपिंग के समान होती है, और फिर दूसरे को मैपिंग करती है। --- Typeclassopedia

(मैं नहीं देख सकते हैं क्यों यह पहला कानून दूसरे नियम का अर्थ है, लेकिन मैं एक कुशल Haskeller नहीं कर रहा हूँ - अपने शायद स्पष्ट जब आप जानते हैं क्या हो रहा है)

+0

अपने आप पर बहुत कठिन मत बनो - यह इतना स्पष्ट नहीं है। –

2

यह ऐसा लगता है कि यह quite recently महसूस किया गया था कि कानून 2 कानून 1 से मिलता है। इस प्रकार, जब दस्तावेज़ मूल रूप से लिखा गया था, तो शायद इसे एक स्वतंत्र आवश्यकता माना जाता था।

(व्यक्तिगत रूप से, मैं तर्क से सहमत हूँ नहीं, लेकिन जब से मैं समय अपने आप विवरण बाहर काम करने नहीं किया था, मैं इसे यहाँ संदेह का लाभ दे रही है कर रहा हूँ।)

+0

आपके द्वारा प्रदान किया गया लिंक दूसरे कानून के बजाए 'कानून' उदाहरणों की विशिष्टता के बारे में प्रतीत होता है ... [यह धागा] (http://www.haskell.org/pipermail/haskell-cafe/2010- जनवरी/thread.html # 71631) उत्तरार्द्ध के बारे में है। –

+0

ओह, आप शायद सही हैं। लेकिन बिंदु खड़ा है :) – ibid

12

seq का उपयोग करना, हम एक उदाहरण है, जिसमें पहला नियम नहीं बल्कि एक दूसरे को संतुष्ट करता है लिख सकते हैं।

data Foo a = Foo a 
    deriving Show 

instance Functor Foo where 
    fmap f (Foo x) = f `seq` Foo (f x) 

हम पुष्टि कर सकते हैं कि इस संतुष्ट पहला कानून:

> fmap (const 42 . undefined) $ Foo 3 
Foo 42 
> fmap (const 42) . fmap undefined $ Foo 3 
*** Exception: Prelude.undefined 

कहा कि, हम आम तौर पर इस तरह के रोग के मामलों की अनदेखी:

fmap id (Foo x) 
= id `seq` Foo (id x) 
= Foo (id x) 
= Foo x 

हालांकि, यह दूसरे नियम टूट जाता है।

+1

ध्यान दें कि जब आप नीचे के मूल्य शामिल होते हैं तो विभिन्न व्यवहारों के बीच सीईसी के साथ भेदभाव करते हैं, तो आप टाइप सिस्टम को "क्रैकिंग" कर रहे हैं। हैकेल प्रकार हास्क श्रेणी का निर्माण करते हैं, कार्यों के रूप में morphisms, _if_ आप बोतलों को शामिल नहीं करते हैं। यदि आप तस्वीर में बोतलों को शामिल करते हैं, तो आपके जैसा एक हेरफेर दिखाता है कि परिणामस्वरूप संरचना एक श्रेणी नहीं है (सहयोगी विफलता विफल होती है) इसलिए मज़ेदारों के बारे में बात करना समझ में नहीं आता है – gigabytes

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