मैं काफी Clojure के लिए नया हूँ, हालांकि मैं कार्यात्मक भाषाओं, मुख्य रूप से स्काला से परिचित हूँ।संचालन
मैं यह जानने की कोशिश कर रहा हूं कि क्लोजर में संग्रह पर काम करने के लिए बेवकूफ तरीका क्या है। मैं विशेष रूप से map
जैसे कार्यों के व्यवहार से उलझन में हूं। इसके बजाय
List(1, 2, 3) map (2 *) == List(2, 4, 6)
Set(1, 2, 3) map (2 *) == Set(2, 4, 6)
Vector(1, 2, 3) map (2 *) == Vector(2, 4, 6)
, Clojure में,:
स्काला में, एक बड़ी सावधानी बनाने ताकि map
हमेशा मूल संग्रह के एक ही प्रकार का एक संग्रह वापस आ जाएगी में लिया जाता है, जब तक यह समझ में आता है के रूप में जहाँ तक मैं समझता हूँ, इस तरह के map
या filter
के रूप में सबसे संचालन आलसी हैं, तब भी जब उत्सुक डेटा संरचनाओं पर लागू। यह
(map #(* 2 %) [1 2 3])
एक आलसी-सूची के बजाय एक सदिश बनाने का अजीब परिणाम है।
जबकि मैं सामान्य रूप से आलसी परिचालन पसंद करता हूं, मुझे उपरोक्त भ्रमित लगता है। वास्तव में, वेक्टर कुछ प्रदर्शन विशेषताओं की गारंटी देते हैं जो सूचियां नहीं करते हैं।
कहें कि मैं ऊपर से परिणाम का उपयोग करता हूं और इसके अंत में जोड़ता हूं। अगर मैं सही ढंग से समझता हूं, तो परिणाम का मूल्यांकन तब तक नहीं किया जाता जब तक कि मैं इसे जोड़ने की कोशिश नहीं करता, फिर मूल्यांकन किया जाता है और मुझे वेक्टर की बजाय सूची मिलती है; तो मुझे अंत में जोड़ने के लिए इसे पार करना होगा। बेशक मैं इसे बाद में वेक्टर में बदल सकता हूं, लेकिन यह गन्दा हो जाता है और इसे अनदेखा किया जा सकता है।
अगर मैं सही ढंग से समझ, map
बहुरूपी है और इसे लागू करने के लिए एक समस्या नहीं होगी, ताकि यह वैक्टर पर एक वेक्टर, सूची में एक सूची, नदियों पर एक धारा (आलसी अर्थ विज्ञान के साथ इस समय) और इतने पर रिटर्न है । मुझे लगता है कि मुझे क्लोजर और उसके मुहावरे के बुनियादी डिजाइन के बारे में कुछ याद आ रहा है।
कारण clojure डेटा संरचनाओं पर बुनियादी संचालन संरचना preverse नहीं है क्या है?
मानचित्र के लिए स्रोत कोड देखें। मानचित्र संग्रह के प्रकार के बारे में परवाह नहीं करता है। आप मानचित्र के शीर्ष पर एक मैक्रो बना सकते हैं जो संग्रह के प्रकार को याद करता है, और संग्रह को अंत में उस प्रकार में परिवर्तित करता है। https://github.com/clojure/clojure/blob/master/src/clj/clojure/core/reducers.clj –
https://github.com/ में clojure.algo.generic.functor/fmap पर एक नज़र डालें एक 'नक्शा' कार्यान्वयन के लिए clojure/algo.generic जो इनपुट प्रकार को संरक्षित करता है। – Alex