आवेदन में शुद्ध की जरूरत है


19

मैं हास्केल के आवेदन सीख रहा हूं। यह मुझे लगता है (मैं शायद गलत हूं) कि pureफ़ंक्शन को वास्तव में ज़रूरत नहीं है, उदाहरण के लिए:

pure (+) <*> [1,2,3] <*> [3,4,5]

के रूप में लिखा जा सकता है

(+) <$> [1,2,3] <*> [3,4,5]

क्या कोई लाभ बता सकता है कि pureफ़ंक्शन स्पष्ट मानचित्रण के साथ प्रदान करता है fmap?


1
आप सही कर रहे हैं - pure f <*> xके रूप में बिल्कुल वैसा ही है fmap f x। मुझे यकीन है कि ऐसा कुछ कारण है कि मुझे क्यों pureशामिल किया गया था Applicative, लेकिन मुझे पूरी तरह से यकीन नहीं है कि क्यों।
bradrn

4
मेरे पास एक उत्तर के लिए समय नहीं है, और यह आश्वस्त नहीं है कि यह किसी भी तरह से अच्छा या पूर्ण होगा, लेकिन एक अवलोकन: pureएक को एक संगणनात्मक गणना में "शुद्ध" मानों का उपयोग करने की अनुमति देता है। हालांकि, जैसा कि आप सही ढंग से निरीक्षण करते हैं, pure f <*> xवही है f <$> x, के लिए ऐसा कोई समकक्ष नहीं है, कहते हैं f <*> x <*> pure y <*> z,। (कम से कम मुझे ऐसा नहीं लगता।)
रॉबिन ज़िगमंड

3
एक और, अधिक सैद्धांतिक, औचित्य के रूप में - एक वैकल्पिक सूत्रीकरण है जो इसे महत्वपूर्ण Monoidवर्ग से निकटता से संबंधित करता है - जिसमें यह पहचान तत्व pureसे मेल खाता है Monoid। (इससे पता चलता है कि Applicativeबिना pureदिलचस्प हो सकता है, क्योंकि Semigroup- जो Monoidजरूरी नहीं कि एक पहचान के बिना है - अभी भी उपयोग किया जाता है। वास्तव में, अब मैं इसके बारे में सोचता हूं, मुझे लगता है कि मुझे याद है कि PureScript के पास वास्तव में ऐसा "आवेदन के बिना pure" वर्ग है, हालांकि मैं डॉन 'यह नहीं जानते कि यह किसलिए इस्तेमाल किया जाता है।)
रॉबिन जिगमंड

2
fmap (\f' x' z' -> f' x' y z') f <*> x <*> zमुझे लगता है @RobinZigmond । विचार Applicative"इंटरचेंज" के कानून के रूप में प्रलेखन में है।
HTNW

3
@RobinZigmond Applicativeबिना pureमौजूद नहीं है जैसा कि सेमीग्रुपॉयड Applyसे होता है
डुप्लोड

जवाबों:


8

मैं यहां अपनी योग्यता के किनारे पर हूं, इसलिए इसे इससे अधिक के लिए न लें, लेकिन यह एक टिप्पणी के लिए बहुत लंबा था।

pureप्रकार वर्ग में शामिल करने के लिए व्यावहारिक कारण हो सकते हैं , लेकिन कई हास्केल अमूर्त सैद्धांतिक नींव से प्राप्त होते हैं, और मेरा मानना ​​है कि यही मामला है Applicative। जैसा कि दस्तावेज़ीकरण कहता है, यह एक मजबूत लक्स मोनॉयडल फ़ंक्टर है ( एक विस्तार के लिए https://cstheory.stackexchange.com/q/12412/56098 देखें )। मुझे लगता है कि पहचान केpure रूप में कार्य करता है , जैसे के लिए करता है (जो एंडोफ़नक्टरों की श्रेणी में एक मोनॉयड है )।returnMonad

विचार करें pureऔर liftA2:

pure :: a -> f a
liftA2 :: (a -> b -> c) -> f a -> f b -> f c

यदि आप थोड़ा सा स्क्विट करते हैं, तो आप कल्पना कर सकते हैं कि liftA2यह एक बाइनरी ऑपरेशन है, जो कि प्रलेखन राज्यों में भी है:

कार्रवाई के लिए एक बाइनरी फ़ंक्शन उठाएं।

pure, तो, इसी पहचान है।


6
बिल्कुल सही। Applicativeबिना एक मोनोएडल के बजाय pureए, एचएम, सेमीग्रुपल फंक्टर होगा।
लेफ्टअरबेटा

20

fmapहमेशा इसे काटता नहीं है। विशेष रूप से, pureवह है जो आपको पहले से ही नहीं होने पर f(जहां fहै Applicative) परिचय देता है। एक अच्छा उदाहरण है

sequence :: Applicative f => [f a] -> f [a]

यह मानों के निर्माण की "क्रियाओं" की सूची लेता है और मूल्यों की सूची बनाने वाली क्रिया में बदल जाता है। क्या होता है जब सूची में कोई कार्रवाई नहीं होती है? केवल संत परिणाम एक ऐसी कार्रवाई है जो कोई मूल्य नहीं पैदा करती है:

sequence [] = pure [] -- no way to express this with an fmap
-- for completeness
sequence ((:) x xs) = (:) <$> x <*> sequence xs

यदि आपके पास नहीं था pure, तो आपको कार्यों की गैर-रिक्त सूची की आवश्यकता होगी। आप निश्चित रूप से इसे काम कर सकते हैं, लेकिन यह 0 का उल्लेख किए बिना जोड़ के बारे में बात करने जैसा है या 1 के बिना गुणा करना है (जैसा कि अन्य ने कहा है, क्योंकि Applicativeएस मोनॉयडल हैं)। आप बार-बार किनारे के मामलों में भाग लेंगे जो आसानी से हल हो जाएंगे, pureलेकिन इसके बजाय अपने इनपुट और अन्य बैंड-एड्स पर अजीब प्रतिबंधों से हल करना होगा ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.