हास्केल में मैप का क्या मतलब है, जब फामैप है?


97

हर जगह मैंने प्रयोग करने की कोशिश की है map, fmapसाथ ही साथ काम भी किया है। हास्केल के रचनाकारों को एक mapसमारोह की आवश्यकता क्यों महसूस हुई ? क्या यह अभी नहीं हो सकता है जो वर्तमान में जाना जाता है fmapऔर fmapभाषा से हटाया जा सकता है?


11
मुझे लगता है कि आप पूछ रहे हैं कि 'हास्केल में फेम की बात क्या है'?
zw324

11
मुझे पता है कि बिंदु क्या fmapहै। यह एक फनकार उदाहरण पर एक फ़ंक्शन को मैप करने के लिए है। मैं विशेषज्ञता के उद्देश्य के लिए abou8t सोच रहा हूँ map
क्लार्क गैबेल

जवाबों:


95

मैं उत्तर का ध्यान आकर्षित करने के लिए उत्तर देना चाहूंगा :

वास्तव में ऐसा नहीं है। क्या हुआ था कि हास्केल 1.3 में फंक्टर को कवर करने के लिए मानचित्र के प्रकार को सामान्य किया गया था। यानी, हास्केल में 1.3 fmap को मैप कहा जाता था। यह परिवर्तन तब हास्केल 1.4 में वापस कर दिया गया था और फैंप पेश किया गया था। इस परिवर्तन का कारण शैक्षणिक था; जब हास्केल को शुरुआती लोगों को सिखाना बहुत सामान्य प्रकार के नक्शे में त्रुटि संदेशों को समझने में अधिक कठिन बना। मेरी राय में यह समस्या को हल करने का सही तरीका नहीं था।

हास्केल 98 को कुछ हास्केलर्स (मेरे सहित) द्वारा पिछले चरण के रूप में देखा जाता है, पिछले संस्करणों में एक अधिक सार और सुसंगत पुस्तकालय परिभाषित किया गया है। ओह अच्छा।


16
क्या ये पिछड़े हुए कदम कहीं एकत्र और प्रलेखित हैं? यह देखना दिलचस्प होगा कि एक और कदम क्या माना जाता है और अगर उनके साथ भी बेहतर समाधान हैं।
जेवर

3
map and fmapएक लंबे समय के लिए चारों ओर हो गया है - यह अगस्त 2006 में हास्केल-प्राइम मेलिंग सूची पर पुन: गर्म किया गया था - haskell.org/pipermail/haskell-prime/2006-August/thread.html । एक काउंटरपॉइंट के रूप में, मैं यथास्थिति को प्राथमिकता देता हूं। मेरे लिए, यह मूल्यवान लगता है कि हास्केल का एक सबसेट है जो मोटे तौर पर मिरांडा से मेल खाता है। ब्रिटेन में, मिरांडा को गणित के छात्रों के लिए एक शिक्षण भाषा के रूप में इस्तेमाल किया गया था, न कि केवल कंप्यूटर विज्ञान के छात्रों के लिए। यदि वह आला पहले से ही एक गैर-कार्यात्मक भाषा (जैसे गणितज्ञ) से हार नहीं गया है तो मैं हास्केल को एक एकीकृत mapभरने के साथ नहीं देखता हूं ।
स्टीफन टेटली

35
और मैं आगे भी ध्यान देना चाहूंगा, किसी को भी पहले से ही जानकारी नहीं है, कि अगस्टेंस लेन्स्ट ऑगस्टसन है, जो सभी व्यावहारिक उद्देश्यों के लिए हास्केल के अस्तित्व में आने से पहले हास्केल समुदाय का हिस्सा रहा है, सीएफ। हास्केल का इतिहास , इसलिए प्रश्न में टिप्पणी किसी भी तरह से दूसरे हाथ की सुनवाई नहीं है!
सीए मैककैन

3
हास्केल विकी पर अब नितिपिक्स पेज है जहां इस मुद्दे का उल्लेख किया गया है।
एलेक्सी

यह हास्यास्पद है कि यह निर्णय शैक्षणिक कारणों के लिए किया गया था, क्योंकि मैंने हास्केल सीखने के दौरान हर समय फ्लैटमैप के साथ भ्रमित किया। उन्हें एक साथ n00b फ़ोकसग्रुप मिल जाना चाहिए था। :)
डैनी एंड्रयूज

27

Https://wiki.haskell.org/Typeclassopedia#FunctorFunctor पर प्रलेखन से उद्धरण

आप पूछ सकते हैं कि हमें एक अलग mapफ़ंक्शन की आवश्यकता क्यों है। क्यों न सिर्फ वर्तमान सूची-केवल को दूर कर mapसमारोह, और नाम बदलने fmapके लिए map बजाय? खैर, यह एक अच्छा सवाल है। सामान्य तर्क यह है कि कोई व्यक्ति mapगलत तरीके से उपयोग करते समय हास्केल सीख रहा होता है, बल्कि इसके बजाय सूचियों के बारे में एक त्रुटि देखता है Functor


1
यह मेरे लिए बहुत मायने रखता है।
hbobenicio

25

वे आवेदन साइट पर समान दिखते हैं, लेकिन वे अलग हैं, बिल्कुल। जब आप या तो उन दो कार्यों को लागू करते हैं, mapया fmap, मूल्यों की सूची के लिए वे एक ही परिणाम का उत्पादन करेंगे, लेकिन इसका मतलब यह नहीं है कि वे एक ही उद्देश्य के लिए हैं।

उन दो कार्यों के बारे में जानकारी के लिए क्वेरी करने के लिए एक GHCI सत्र (ग्लासगो हास्केल कम्पाइलर इंटरएक्टिव) चलाएं, फिर उनके कार्यान्वयन पर एक नज़र डालें और आपको कई अंतरों की खोज होगी।

नक्शा

के बारे में जानकारी के लिए क्वेरी जीएचसीआई map

Prelude> :info map
map :: (a -> b) -> [a] -> [b]   -- Defined in ‘GHC.Base’

और आप इसे एक उच्च आदेश समारोह किसी भी प्रकार की मानों की सूची के लिए लागू के रूप में परिभाषित देखेंगे aकिसी भी प्रकार की मानों की सूची उपज b। हालाँकि बहुरूपी ( aऔर bकिसी भी प्रकार के लिए उपरोक्त परिभाषा में) mapफ़ंक्शन को मानों की एक सूची पर लागू करने का इरादा है, जो हास्केल में कई अन्य लोगों के बीच सिर्फ एक संभव डेटा प्रकार है। mapसमारोह जो कुछ मानों की सूची नहीं है करने के लिए लागू नहीं किया जा सका।

जैसा कि आप GHC.Base स्रोत कोड से पढ़ सकते हैं , mapफ़ंक्शन निम्नानुसार लागू किया गया है

map _ []     = []
map f (x:xs) = f x : map f xs

जो सूची के सिर ( ए x) को खींचने के लिए पैटर्न मिलान का उपयोग करता है xs, फिर :प्रीपेन्ड करने के लिए (कंस) वैल्यू कंस्ट्रक्टर का उपयोग करके एक नई सूची का निर्माण करता है f x(इसे "x पर लागू एफ" के रूप में पढ़ें ) mapसूची खाली होने तक पूंछ पर पुनरावृत्ति करना । यह ध्यान देने योग्य है कि mapफ़ंक्शन का कार्यान्वयन किसी अन्य फ़ंक्शन पर निर्भर नहीं करता है, बल्कि केवल स्वयं पर।

FMAP

अब जानकारी के लिए क्वेरी करने का प्रयास करें fmapऔर आपको कुछ अलग दिखाई देगा।

Prelude> :info fmap
class Functor (f :: * -> *) where
  fmap :: (a -> b) -> f a -> f b
  ...
  -- Defined in ‘GHC.Base’

इस समय fmapको उन कार्यों में से एक के रूप में परिभाषित किया गया है, जिनका कार्यान्वयन उन डेटा प्रकारों द्वारा प्रदान किया जाना चाहिए जो Functorटाइप वर्ग से संबंधित हैं । इसका मतलब है कि एक से अधिक डेटा प्रकार हो सकते हैं, न केवल "मूल्यों की सूची" डेटा प्रकार, fmapफ़ंक्शन के लिए एक कार्यान्वयन प्रदान करने में सक्षम है । यह fmapडेटा प्रकारों के एक बहुत बड़े सेट पर लागू होता है: फंक्शनलर्स!

जैसा कि आप GHC.Base स्रोत कोड से पढ़ सकते हैं , fmapफ़ंक्शन का एक संभावित कार्यान्वयन Maybeडेटा प्रकार द्वारा प्रदान किया गया एक है :

instance  Functor Maybe  where
  fmap _ Nothing       = Nothing
  fmap f (Just a)      = Just (f a)

और दूसरा संभावित कार्यान्वयन 2-टपल डेटा प्रकार द्वारा प्रदान किया गया है

instance Functor ((,) a) where
  fmap f (x,y) = (x, f y)

और एक अन्य संभावित कार्यान्वयन सूची डेटा प्रकार (निश्चित रूप से!) द्वारा प्रदान किया गया है:

instance  Functor []  where
  fmap f xs = map f xs

जो mapफ़ंक्शन पर निर्भर करता है ।

निष्कर्ष

mapसमारोह मानों की सूची (जहां मूल्यों किसी भी प्रकार की कर रहे हैं) से ज्यादा कुछ नहीं करने के लिए लागू किया जा सकता है, जबकि fmapसमारोह और अधिक डेटा प्रकार लागू किया जा सकता: जैसे maybes, tuples, सूची, आदि उन (जो functor वर्ग के अंतर्गत आता है के सभी )। चूंकि "मूल्यों की सूची" डेटा प्रकार भी एक फ़नकार है (क्योंकि यह इसके लिए एक कार्यान्वयन प्रदान करता है) तो इसे fmapलागू किया जा सकता है और साथ ही साथ बहुत ही परिणाम भी उत्पन्न कर रहा है map

map  (+3) [1..5]
fmap (+3) (Just 15)
fmap (+3) (5, 7)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.