क्या केवल 'FlippyFloppyMorphism' `const mempty 'है?

Sep 25 2020

हास्केल में, हमारे पास दिलचस्प तथ्य यह है कि किसी भी प्रकार का निर्माणकर्ता f :: * -> *जो एक साथ एक है Functorऔर Contravariantअपने प्रकार के पैरामीटर में एक प्रेत है:

phantom :: (Functor f, Contravariant f) => f x -> f y

एक अन्य तरीका यह डाल करने के लिए है कि हर प्रकार के निर्माता एक साथ एक है कि Functorऔर एक Contravariantस्वाभाविक रूप से करने के लिए है isomorphic Const xकुछ के लिए, x।

इसका तात्पर्य यह है कि वर्ग को पलटने के लिए "केवल" तरीका (समरूपता तक)

class FlippyFloppyFunctor f
  where
  ffmap :: Either (y -> x) (x -> y) -> f x -> f y

ताकि यह फनकार कानून का पालन करे:

ffmap (Left id)       = id
ffmap (Right id)      = id
ffmap (Left  (g . f)) = ffmap (Left f)  . ffmap (Left g)
ffmap (Right (f . g)) = ffmap (Right f) . ffmap (Right g)

है:

weirdmap :: Either (y -> x) (x -> y) -> Const r x -> Const r y
weirdmap = const $ \(Const x) -> Const x

यानी मोडुलो न्यूटाइप्स const id,।

मुझे यह समझना मुश्किल है कि यह अपने प्रकार का एकमात्र कार्य क्यों है, जो बाधाओं को संतुष्ट करता है, हालांकि मैं इसमें शामिल विभिन्न अनौपचारिक तर्कों को समझ सकता हूं absurd :: Void -> a/ discard :: a -> ()जैसे कि इस तरह के मानचित्र का अस्तित्व का मतलब है कि "फैंटम" अपने प्रकार में है। पैरामीटर।

इसे बेहतर समझने के लिए, मैंने समस्या को आसान बनाने की कोशिश की। के बारे में सोचने के बजाय FlippyFloppyFunctor, आइए विचार करें:

class (Monoid a, Monoid b) => FlippyFloppyMorphism a b
  where
  ffmorph :: Either a a -> b

अनुरूप कानूनों के साथ:

ffmorph (Left mempty)    = mempty
ffmorph (Right mempty)   = mempty
ffmorph (Left  (y <> x)) = ffmorph (Left x)  <> ffmorph (Left y)
ffmorph (Right (x <> y)) = ffmorph (Right x) <> ffmorph (Right y)

यह मानते हुए कि aऔर b गैर-कम्यूटेटिव मोनॉयड हैं , क्या यह अभी भी सच है कि एकमात्र कानून लागू करना FlippyFloppyMorphismहै const mempty? क्या यह स्पष्ट करना अभी भी संभव है कि मॉर्फ़िज़ को इनपुट मोनोड्स में "फैंटम" क्यों होना चाहिए, Voidया बिना ()संदर्भित करने के लिए?

जवाब

1 AsadSaeeduddin Sep 25 2020 at 14:43

यह मुझे लगता है कि सामान्य मामले में जवाब "नहीं" है, क्योंकि मोनॉयड्स कम्यूटेटिव हो सकते हैं।

यदि मोन्यूड कम्यूटेटिव है, तो Dual aजैसा है वैसा ही मोनॉयड है a, और Either a aजैसा है वैसा ही है a, और इसलिए हम केवल यह पूछने के लिए पतित हैं कि क्या ffmorphकेवल मोनोड होमोर्फिज्म है a -> b। जवाब न है"।

उदाहरण के लिए, इसके अलावा, के स्मारक स्मारक के लिए, हमारे पास replicate 'a' :: Either (Sum Int) (Sum Int) -> String:

replicateA (Left  0) = ""
replicateA (Right 0) = ""
replicateA (Left  (y + x)) = replicateA (Left x) ++ replicateA (Left y)
replicateA (Right (x + y)) = replicateA (Left x) ++ replicateA (Left y)

हालांकि, मुझे लगता है कि यह मामला हो सकता है कि _non_commutative monoids के लिए, केवल संभव कार्यान्वयन है const mempty(जिसके लिए मेरे पास अभी भी प्रमाण नहीं है)।