वे आवेदन साइट पर समान दिखते हैं, लेकिन वे अलग हैं, बिल्कुल। जब आप या तो उन दो कार्यों को लागू करते हैं, 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)