एक फ्री फू सबसे सरल बात है जो सभी 'फू' कानूनों को संतुष्ट करती है। यह कहना है कि यह वास्तव में एक फू होने के लिए आवश्यक कानूनों को संतुष्ट करता है और कुछ भी अतिरिक्त नहीं है।
एक भुलक्कड़ फ़नकार वह है जो संरचना का एक हिस्सा "भूल जाता है" क्योंकि यह एक श्रेणी से दूसरी श्रेणी में जाता है।
यह देखते हुए कि फंक्शनलर्स F : D -> C
, और G : C -> D
, हम कहते हैं F -| G
, जब भी ए, बी: आइसोमोर्फिक है , जहां उपयुक्त श्रेणियों से तीर आते हैं , के F
लिए आसन्न छोड़ दिया जाता है G
, या G
सही F
निकटवर्ती है ।F a -> b
a -> G b
औपचारिक रूप से, एक मुक्त फ़नकार को एक भुलक्कड़ फ़नकार के निकट छोड़ दिया जाता है।
फ्री मोनॉयड
आइए हम एक सरल उदाहरण के साथ शुरू करते हैं, मुक्त मोनोइड।
एक मोनॉइड लें, जिसे कुछ वाहक सेट द्वारा परिभाषित किया गया है T
, एक जोड़ी तत्वों को एक साथ मैश करने के लिए एक बाइनरी फ़ंक्शन f :: T → T → T
, और एक unit :: T
, जैसे कि आपके पास एक सहयोगी कानून और एक पहचान कानून है f(unit,x) = x = f(x,unit)
:।
आप U
मोनॉइड्स की श्रेणी से एक फ़नकार बना सकते हैं (जहाँ तीर मोनोइड होमोमोर्फिज्म होते हैं, यानी वे दूसरे मोनोइड पर मैप unit
को सुनिश्चित करते हैं unit
, और यह कि आप अन्य मोनॉइड को मैप करने से पहले या बाद में कंपोज़ कर सकते हैं, मतलब बिना श्रेणी में आए) सेट के सेट (जहां तीर केवल फ़ंक्शन तीर हैं) ऑपरेशन के बारे में 'भूल जाते हैं' unit
और बस आपको वाहक सेट देता है।
फिर, आप एक फ़नकार F
को सेट्स की श्रेणी से वापस उन मन्त्रों की श्रेणी में परिभाषित कर सकते हैं जो इस फ़नकार से सटे हुए हैं। वह फ़नकार वह फ़नकार है जो एक सेट a
को मोनॉइड [a]
, जहाँ unit = []
और, पर मैप करता है mappend = (++)
।
छद्म-हास्केल में अब तक हमारे उदाहरण की समीक्षा करने के लिए:
U : Mon → Set -- is our forgetful functor
U (a,mappend,mempty) = a
F : Set → Mon -- is our free functor
F a = ([a],(++),[])
फिर दिखाने के F
लिए स्वतंत्र है, हमें यह प्रदर्शित करने की आवश्यकता है कि यह U
एक विपर्यय फ़नकार के निकट है, जैसा कि हमने ऊपर बताया है, हमें यह दिखाने की आवश्यकता है
F a → b
isomorphic to है a → U b
अब, लक्ष्य को याद रखें कि F
यह Mon
मोनॉयड की श्रेणी में है, जहां तीर मोनोइड होमोमोर्फिज्म हैं, इसलिए हमें यह दिखाने की आवश्यकता है कि एक मोनोइड होमोर्फिज्म से [a] → b
एक फ़ंक्शन द्वारा ठीक वर्णित किया जा सकता है a → b
।
हास्केल में, हम इस पक्ष को कहते हैं जो Set
(एर,, Hask
हास्केल प्रकारों की श्रेणी, जिसे हम दिखावा करते हैं, सेट है), बस foldMap
, जिसे जब Data.Foldable
सूचियों से विशेष प्रकार में टाइप किया जाता है Monoid m => (a → m) → [a] → m
।
वहाँ परिणाम है कि इस से एक सहायक होने का पालन कर रहे हैं। विशेष रूप से अगर आप भूल जाते हैं तो मुफ्त में निर्माण करें, फिर से भूल जाएं, जैसे कि आप एक बार भूल गए हैं, और हम इसका उपयोग कर सकते हैं बनाने के लिए मौद्रिक में शामिल हों। के बाद से UFUF
~ U(FUF)
~ UF
, और हम पहचान monoid समरूपता में से पारित कर सकते हैं [a]
करने के लिए [a]
समाकृतिकता कि हमारे adjunction को परिभाषित करता है के माध्यम से, कि से एक सूची समाकृतिकता मिल [a] → [a]
प्रकार की एक समारोह है a -> [a]
, और यह सिर्फ सूचियों के लिए लौट रहा है।
आप इन शब्दों में एक सूची का वर्णन करके इस सब को और अधिक सीधे लिख सकते हैं:
newtype List a = List (forall b. Monoid b => (a -> b) -> b)
फ्री मोनाड
तो फ्री मोनाड क्या है ?
ठीक है, हम वही काम करते हैं जो हमने पहले किया था, हम भिक्षुओं की श्रेणी से एक भुलक्कड़ फ़नकार यू के साथ शुरू करते हैं जहाँ तीर मोनोड होमोमोर्फिम्स हैं जो एंडोफ़ुन्क्टरों की श्रेणी में आते हैं जहाँ तीर प्राकृतिक परिवर्तन होते हैं, और हम एक ऐसे फ़ंक्टर की तलाश करते हैं जो बगल में छोड़ दिया जाता है उस से।
तो, यह एक मुफ्त मोनाड की धारणा से कैसे संबंधित है जैसा कि आमतौर पर उपयोग किया जाता है?
यह जानते हुए कि कुछ एक स्वतंत्र मोनाड है, Free f
आपको बताता है कि Free f -> m
एक प्राकृतिक परिवर्तन (एक फनकार होमोर्फिज्म) के रूप में एक मोनड होमोमोर्फिज्म से एक ही चीज़ (आइसोमॉर्फिक) है f -> m
। याद रखें कि एफ के लिए F a -> b
समवर्ती होना चाहिए a -> U b
यू को छोड़ दिया जाए।
एफ कम से कम आइसोमॉर्फिक है जिस Free
प्रकार मैं अपने free
पैकेज में हैकेज पर उपयोग करता हूं।
हम इसे परिभाषित करके नि: शुल्क सूची के लिए ऊपर दिए गए कोड के अनुरूप भी बना सकते हैं
class Algebra f x where
phi :: f x -> x
newtype Free f a = Free (forall x. Algebra f x => (a -> x) -> x)
कॉफ्री कोमोनॉड्स
हम कुछ इसी तरह का निर्माण कर सकते हैं, यह मानते हुए कि एक भुलक्कड़ फ़नकार के लिए सही निकटता को देखते हुए। एक कॉफ़्री फ़ंक्टर बस / सही निकटवर्ती / एक भुलक्कड़ फ़नकार के लिए, और समरूपता द्वारा, कुछ जानना एक कॉफ़ी कॉमनॉड है, यह जानने के समान है कि कॉमनड होमोमोर्फिज़्म w -> Cofree f
देना एक प्राकृतिक परिवर्तन देने के समान है w -> f
।