हमारे पास मैप, फ़ैप और लिफ्टम क्यों है?


102
map :: (a -> b) -> [a] -> [b]

fmap :: Functor f => (a -> b) -> f a -> f b

liftM :: Monad m => (a -> b) -> m a -> m b

हमारे पास तीन अलग-अलग कार्य क्यों हैं जो अनिवार्य रूप से एक ही काम करते हैं?


32
इतिहास, ज्यादातर। fmap शैक्षणिक कारणों के लिए मानचित्र से अलग है, ऐतिहासिक कारणों के लिए fmap से अलग से लिफ्ट (अर्थात् फ़नकार मोनाड का सुपरक्लास नहीं है)
luqui

12
ओह, और सिर्फ स्पष्ट होने के लिए: वे "अनिवार्य रूप से" एक ही काम नहीं करते हैं। दोनों mapऔर liftMसबसे निश्चित रूप से बिल्कुल वैसा ही करना चाहिए जैसा कि fmap
सीए मैक्कन

2
जबकि fmapऔर liftMबिल्कुल एक ही बात करते हैं, mapज़ाहिर है कि उनमें से केवल एक विशेष मामला है, यानी कुछ अलग। fmap id getLineअच्छी तरह से टाइप किया गया है, जबकि map id getLineनहीं है।
थोरस्टें

जवाबों:


91

mapसूचियों पर और ऐतिहासिक कारणों से कार्यों को सरल बनाने के लिए मौजूद है (देखें कि हाॅम्सेप में मैप का क्या मतलब है, जब फैप है )।

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

- टाइपक्लासोपेडिया , पृष्ठ 20

fmapऔर liftMमौजूद है क्योंकि हास्केल में मोनडर्स स्वचालित रूप से फंक्शनल नहीं थे:

तथ्य यह है कि हमारे पास फैप और लिफ्टम दोनों हैं, इस तथ्य का एक दुर्भाग्यपूर्ण परिणाम है कि मोनाड प्रकार वर्ग को फ़ंक्टर उदाहरण की आवश्यकता नहीं है, भले ही गणितीय रूप से बोलते हुए, हर मोनाड एक फ़नकार है। हालांकि, किसी भी प्रकार के लिए फन और लिफ्टम अनिवार्य रूप से विनिमेय हैं, क्योंकि यह किसी भी प्रकार के लिए एक बग (तकनीकी अर्थ में सामाजिक रूप से) एक प्रकार का मौन का एक उदाहरण है, जिसमें फन्नेरे का उदाहरण भी नहीं है।

- टाइपक्लासोपेडिया , पृष्ठ 33

संपादित करें: अगस्टस का इतिहास mapऔर fmap:

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

- फासप होने पर हास्केल में नक्शे का क्या मतलब है?


13
और, मेरे दृष्टिकोण से, किसी ऐसे व्यक्ति के रूप में, जिसने पहली बार हस्केल का सामना किया था, परिवर्तन के बाद एक दशक से भी अधिक समय के बाद @augustss का वर्णन किया गया था, और अब भाषा सीखने वाले लोगों की मदद करने में बहुत समय बिताया है, यह बिल्कुल भी स्पष्ट नहीं है कि इससे भी मदद मिली किसी भी तरह। निश्चित रूप से बेकार अतिरेक को भरने के लिए पर्याप्त नहीं है (जो खुद लोगों को इस तरह के सवाल पूछने की ओर ले जाता है); Functorवर्ग भी अनदेखी करने के लिए आम है, और शुरुआती अक्सर वैसे भी त्रुटि संदेश से उलझन में कर रहे हैं!
सीए मैक्कैन

10
क्या हम सिर्फ हटा नहीं सकते liftM? कोड को तोड़ने दें, कौन परवाह करता है, आमतौर पर कोड को जीथब पर तय करने में 2 दिन से कम समय लगता है और फिर हैकेज पर अपलोड किया जाता है। या मैं जंगली और पागल हो रहा हूँ?
Tarrasch

1
@ टार्च: हर कोई गीथब का उपयोग नहीं करता है, सभी पैकेजों को समय पर अपडेट होने के लिए एक महान ट्रैक-रिकॉर्ड नहीं है, और मैं एक के लिए एक डॉक liftM-ब्लॉक में whilst का उपयोग करने की प्रवृत्ति रखता हूं, fmapक्योंकि यह मेरे द्वारा उपयोग किए जाने पर बेहतर के साथ फिट बैठता है liftM2, आदि। भी।
ivanm

1
@ L01man लोगों ने इस पर काम किया है; देखें stackoverflow.com/questions/5730270/… और कम से कम संख्यात्मक वर्गों के लिए, विकल्प हैं: hackage.haskell.org/packages/archive/numeric-prelude/0.3.0.2/…
li.dididm

1
@ L01man हां यह जल्द ही तय हो जाएगा। अनुप्रयोगी इकाई प्रस्ताव (एएमपी) जैसे कि यह हास्केल के अगले संस्करण में पारित होगा लग रहा है। संक्रमण के लिए मौजूदा कोड को अपडेट करने में मदद के लिए GHC 7.8.3 में एक नया झंडा --fwarn-ampहै।
रिकर्सियन.निंजा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.