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