Applicative
Typeclass का प्रतिनिधित्व करता है ढीला monoidal functors कि आपके द्वारा लिखे गए कार्यों की श्रेणी पर कार्तीय monoidal संरचना की रक्षा।
दूसरे शब्दों में, (,)
एक सांध्यात्मक संरचना को देखते हुए विहित आइसोमोर्फिम्स दिए गए हैं :
-- Implementations left to the motivated reader
assoc_fwd :: ((a, b), c) -> (a, (b, c))
assoc_bwd :: (a, (b, c)) -> ((a, b), c)
lunit_fwd :: ((), a) -> a
lunit_bwd :: a -> ((), a)
runit_fwd :: (a, ()) -> a
runit_bwd :: a -> (a, ())
टाइपकास्ट और इसके कानून को इस तरह लिखा जा सकता है:
class Functor f => Applicative f
where
zip :: (f a, f b) -> f (a, b)
husk :: () -> f ()
-- Laws:
-- assoc_fwd >>> bimap id zip >>> zip
-- =
-- bimap zip id >>> zip >>> fmap assoc_fwd
-- lunit_fwd
-- =
-- bimap husk id >>> zip >>> fmap lunit_fwd
-- runit_fwd
-- =
-- bimap id husk >>> zip >>> fmap runit_fwd
कोई भी आश्चर्यचकित हो सकता है कि एक फंक्शनल जो कि एक ही संरचना के संबंध में ओपलैक्स मोनोइडल है, वह कैसा दिख सकता है:
class Functor f => OpApplicative f
where
unzip :: f (a, b) -> (f a, f b)
unhusk :: f () -> ()
-- Laws:
-- assoc_bwd <<< bimap id unzip <<< unzip
-- =
-- bimap unzip id <<< unzip <<< fmap assoc_bwd
-- lunit_bwd
-- =
-- bimap unhusk id <<< unzip <<< fmap lunit_bwd
-- runit_bwd
-- =
-- bimap id unhusk <<< unzip <<< fmap runit_bwd
यदि हम परिभाषाओं और कानूनों में शामिल प्रकारों के बारे में सोचते हैं, तो निराशाजनक सच्चाई सामने आती है; OpApplicative
इससे अधिक विशिष्ट कोई बाधा नहीं है Functor
:
instance Functor f => OpApplicative f
where
unzip fab = (fst <$> fab, snd <$> fab)
unhusk = const ()
हालांकि, जबकि हर Applicative
फनकार (वास्तव में, कोई भी Functor
) तुच्छ है OpApplicative
, जरूरी नहीं कि जुलाब Applicative
और OpApplicative
अपारदर्शी के बीच एक अच्छा संबंध हो । तो हम मजबूत monoidal फंक्शनल के लिए देख सकते हैं कार्टेशियन monoidal संरचना wrt:
class (Applicative f, OpApplicative f) => StrongApplicative f
-- Laws:
-- unhusk . husk = id
-- husk . unhusk = id
-- zip . unzip = id
-- unzip . zip = id
उपरोक्त पहला कानून तुच्छ है, क्योंकि एकमात्र प्रकार () -> ()
का निवासी पहचान समारोह है ()
।
हालांकि, शेष तीन कानून, और इसलिए उपवर्ग ही, तुच्छ नहीं है। विशेष रूप से, प्रत्येक Applicative
इस वर्ग का वैध उदाहरण नहीं है।
यहां कुछ Applicative
फ़ंक्शंस हैं, जिनके लिए हम वैध उदाहरणों की घोषणा कर सकते हैं StrongApplicative
:
Identity
VoidF
(->) r
(उत्तर देखें)Monoid m => (,) m
Vec (n :: Nat)
Stream
(अनंत)
और यहाँ कुछ Applicative
एस हैं जिनके लिए हम नहीं कर सकते हैं:
[]
Either e
Maybe
NonEmptyList
यहाँ पैटर्न से पता चलता है कि StrongApplicative
कक्षा एक अर्थ में है FixedSize
, जहाँ "निश्चित आकार" * का अर्थ है कि एक निवासी के निवासियों की बहुलता ** निर्धारित है।a
f a
यह दो अनुमानों के रूप में कहा जा सकता है:
- हर
Applicative
अपने प्रकार तर्क के तत्वों में से एक "स्थिर आकार" कंटेनर का प्रतिनिधित्व करने का एक उदाहरण हैStrongApplicative
- ऐसा कोई उदाहरण
StrongApplicative
मौजूद नहीं है जिसमें घटनाओं की संख्याa
भिन्न हो सकती है
क्या कोई भी ऐसे संदर्भों के बारे में सोच सकता है जो इन अनुमानों को खारिज करते हैं, या कुछ ठोस तर्क जो यह प्रदर्शित करते हैं कि वे सच्चे या झूठे क्यों हैं?
* मुझे एहसास है कि मैंने विशेषण "निश्चित आकार" को ठीक से परिभाषित नहीं किया है। दुर्भाग्य से कार्य थोड़ा सा गोलाकार है। मुझे "निश्चित आकार" कंटेनर के किसी भी औपचारिक विवरण का पता नहीं है, और मैं एक के साथ आने की कोशिश कर रहा हूं। StrongApplicative
मेरी अब तक की सबसे अच्छी कोशिश है।
मूल्यांकन करने के लिए कि क्या यह एक अच्छी परिभाषा है, हालांकि, मुझे इसकी तुलना करने के लिए कुछ चाहिए। किसी प्रकार के फ़नकार के लिए कुछ औपचारिक / अनौपचारिक परिभाषा को देखते हुए, उसके प्रकार के तर्क के निवासियों के संबंध में किसी दिए गए आकार या गुणन के लिए इसका मतलब है, सवाल यह है कि क्या एक StrongApplicative
उदाहरण का अस्तित्व निश्चित रूप से निश्चित और भिन्न आकार के फंक्शंस को अलग करता है।
मौजूदा औपचारिक परिभाषा से अवगत नहीं होने के कारण, मैं "निश्चित आकार" शब्द के उपयोग में अंतर्ज्ञान की अपील कर रहा हूं। हालांकि अगर किसी को पहले से ही एक फ़न्क्टर के आकार के लिए एक औपचारिक औपचारिकता का पता है और वह इसकी तुलना StrongApplicative
कर सकता है, तो बेहतर है।
** "गुणन" के द्वारा मैं फफूंद के पैरामीटर प्रकार के "ढीले अर्थ" का जिक्र करता हूं, जो कि फंटर के पैरामीटर प्रकार के अनियंत्रित तत्व फंकीर के कोडोमैन प्रकार के निवासियों में होते हैं। यह विशिष्ट प्रकार के संबंध के बिना है जिस पर फ़नकार को लागू किया जाता है, और इसलिए पैरामीटर प्रकार के किसी भी विशिष्ट निवासियों के संबंध के बिना।
इसके बारे में सटीक नहीं होने के कारण टिप्पणियों में कुछ भ्रम पैदा हो गया है, इसलिए यहां कुछ उदाहरणों के बारे में कुछ उदाहरण प्रस्तुत करूंगा, जो कि विभिन्न प्रकारों के आकार / गुणन को मानते हैं:
VoidF
: नियत, ०Identity
: नियत, १Maybe
: चर, न्यूनतम ०, अधिकतम १[]
: चर, न्यूनतम 0, अधिकतम अनंतNonEmptyList
: चर, न्यूनतम 1, अधिकतम अनंतStream
: निश्चित, अनंतMonoid m => (,) m
: नियत, १data Pair a = Pair a a
: नियत, २Either x
: चर, न्यूनतम ०, अधिकतम १data Strange a = L a | R a
: नियत, १
(->) r
वे सही तरीके से आइसोमॉर्फिक हैं।
(->) r
; आपको मजबूत एपेरेटिव संरचना को संरक्षित करने के लिए आइसोमोर्फिज्म के घटकों की आवश्यकता होती है। किसी कारण के लिए Representable
हास्केल में टाइपकास्ट में एक रहस्यमय tabulate . return = return
कानून है (जो वास्तव में गैर राक्षसी फंक्शंस के लिए भी समझ में नहीं आता है), लेकिन यह हमें उन परिस्थितियों का 1/4 हिस्सा देता है जो हमें कहने की आवश्यकता है tabulate
और zip
एक उपयुक्त श्रेणी के मोनोरेड के रूप हैं । अन्य 3 आपके लिए अतिरिक्त कानून हैं।
tabulate
और index
एक उपयुक्त श्रेणी के आकारिकी हैं ..."
return
नहीं है एक गंभीर समस्या है। / के संदर्भ में / के cotraverse getConst . Const
लिए एक डिफ़ॉल्ट कार्यान्वयन है , क्योंकि वितरण / निरूपण के लिए निश्चित आकार है, कि कार्यान्वयन अद्वितीय है। return
pure
Distributive