9

एक संरचना QuickCheck के promote समारोह, जैसे कि, प्रपत्र के एक समारोह जैसी साथ एक functor के लिए सामान्य शब्द क्या है। (->) r और Id के अलावा, इस तरह के एक ऑपरेशन के साथ कोई भी मज़ेदार भी हैं? (मुझे यकीन है कि वहां होना चाहिए)। गुगलिंग 'क्विक चेक प्रोमोशन' ने केवल क्विक चेक दस्तावेज को बदल दिया है, जो किसी भी सामान्य संदर्भ AFAICS में promote नहीं देता है; 'क्विकचेक प्रोमोशन' के लिए एसओ खोजना कोई परिणाम नहीं देता है।

+0

[ 'sequenceA'] (http://hackage.haskell.org/package/base-4.7.0.1/docs/Data-Traversable.html#v:sequenceA) प्रासंगिक है? –

+0

मुझे देखने दो। 'अनुक्रम ए' के ​​प्रकार में सबस्टिट्यूटिंग, हम 't = (->) a' और' f = f' प्राप्त करेंगे। इसलिए यदि '(->) ए' में 'ट्रैवर्सबल' उदाहरण था, तो यह फ़ंक्शन सभी' ए' के लिए मौजूद होगा। मुझे लगता है कि 'ट्रैवर्सबल ((->) ए) '' की आवश्यकता है (हालांकि, एक, एनम ए) बढ़ाया गया है या समकक्ष है। –

+1

इसके लायक होने के लिए, [ब्रह्मांड] (http://hackage.haskell.org/package/universe) पैकेज परिवार [आवश्यक 'ट्रैवर्सबल' उदाहरण] प्रदान करता है (http://hackage.haskell.org/package/universe -reverse-उदाहरणों-1.0/docs/src/डेटा-यूनिवर्स-उदाहरण-Traversable.html)। –

उत्तर

1

अब तक मैं promote आकारिता के साथ एक f के निर्माण की इन तरीकों से पाया:

  • f = Identity
  • अगर च और छ दोनों promote तो जोड़ी functor h t = (f t, g t) भी करता
  • अगर च और छ दोनों में promote है तो संरचना h t = f (g t) भी
  • है यदि एफ promote संपत्ति है और जी एक है y contrafunctor तो functor h t = g t -> f tpromote संपत्ति

पिछले संपत्ति profunctors छ सामान्यीकृत किया जा सकता है, लेकिन फिर f महज एक profunctor हो जाएगा, तो यह शायद बहुत उपयोगी नहीं है, जब तक आप केवल profunctors आवश्यकता होती है।

f t = (t,t) 

f t = (t, b -> t) 

f t = (t -> a) -> t 

f t = ((t,t) -> b) -> (t,t,t) 

f t = ((t, t, c -> t, (t -> b) -> t) -> a) -> t 

भी ध्यान रखें कि promote संपत्ति का तात्पर्य है कि f बताया है:

अब, इन चार निर्माण का उपयोग कर, हम functors f जिसके लिए promote मौजूद है के कई उदाहरण मिल सकते हैं।

point :: t -> f t 
point x = fmap (const x) (promote id) 

अनिवार्य रूप से एक ही प्रश्न: Is this property of a functor stronger than a monad?

5
(<*>) :: Applicative f => f (a -> b) -> f a -> f b 
(=<<) :: Monad m => (a -> m b) -> m a -> m b 

यह देखते हुए कि इकाई अनुप्रयोगी तुलना में अधिक शक्तिशाली एक इंटरफेस है, यह हमें बताते हैं कि a -> f bf (a -> b) की तुलना में अधिक कर सकते हैं। यह हमें बताता है कि प्रकार (a -> f b) -> f (a -> b) का एक कार्य इंजेक्शन नहीं हो सकता है। डोमेन एक सौहार्दपूर्ण तरीके से कोडोमेन से बड़ा है। इसका मतलब है कि आप संभवतः फ़ंक्शन के व्यवहार को संरक्षित नहीं कर सकते हैं। यह सामान्य जेनेक्टरों में काम नहीं करता है।

आप निश्चित रूप से उन मकानों को चित्रित कर सकते हैं जिनमें वह ऑपरेशन इंजेक्शन है। Identity और (->) a निश्चित रूप से उदाहरण हैं। मैं शर्त लगाने के लिए तैयार हूं कि और उदाहरण हैं, लेकिन कुछ भी तुरंत मुझ पर कूद नहीं आता है।

1

Data.Distributive अपने चर नाम बदल रहा

class Functor g => Distributive g where 
    distribute :: Functor f => f (g a) -> g (f a) 
    -- other non-critical methods 

है, तो आपको

promote :: (c -> g a) -> g (c -> a) 

स्पष्टता के लिए थोड़ा अवैध वाक्य रचना का उपयोग मिलता है,

012,
promote :: ((c ->) (g a)) -> g ((c ->) a) 

(c ->) एक Functor है, इसलिए promote के प्रकार distribute के प्रकार की एक विशेष मामला है। इस प्रकार प्रत्येक Distributive फ़ैक्टर आपके promote का समर्थन करता है। मुझे नहीं पता कि कोई समर्थन promote है लेकिन Distributive नहीं है।

+2

'वितरक' 'प्रचार 'से सख्ती से मजबूत है। प्रत्येक 'वितरक' मज़ेदार 'जी' प्रतिनिधित्व योग्य है: यानी, निरंतर प्रकार 'बी' मौजूद है जैसे 'जी टी = बी -> टी'। हालांकि, 'जी टी = (टी -> ए) -> टी' जैसे' प्रचार 'के रूप में मज़ेदार हैं लेकिन प्रतिनिधित्व नहीं कर रहे हैं और इस प्रकार' वितरक 'होने में असफल होते हैं। अधिक आम तौर पर, 'जी टी = सी टी -> एच टी' के रूप में परिभाषित एक मज़ेदार 'जी' को 'प्रचार' किया जाता है यदि 'सी' कोई contrafunctor है और' एच' 'बढ़ावा दिया है। यह निर्माण केवल 'वितरित करने योग्य' को परिभाषित कर सकता है यदि 'c' स्थिर (अनुबंध) फ़ैक्टर है। – winitzki

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

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