2014-11-01 11 views
8

के रूप में करें, मैं पूरी तरह से लेंस का उपयोग करने के लिए कोड map (^?! ix 0) [[0, 1], [4, 5], [9, 1]] कोड को कनवर्ट करना चाहता हूं, इसलिए [[0, 1], [4, 5], [9, 1]] & each . ix 0 जैसे कुछ। हालांकि, प्रकार मेल नहीं खाते हैं। ऐसा करने का सही तरीका क्या है?लेंस का उपयोग 'मानचित्र'

उत्तर

10

उपयोग folded:

किसी भी Foldable पर
Prelude Control.Lens> [[0, 1], [4, 5], [9, 1]] ^.. folded . ix 0 
[0,4,9] 

काम करता है।

इसके अलावा, यदि आप हमेशा पहले तत्व को निकालने की योजना बनाते हैं, तो शायद ix के बजाय Control.Lens.Cons से _head ट्रैवर्सल का उपयोग करना स्पष्ट होगा।

[[0, 1], [4, 5], [9, 1]] ^.. folded . _head 
10

आप पहली बार मेल खाती

Prelude Control.Lens> [[0, 1], [4, 5], [9, 1]] & each %~ (^?! ix 0) 
[0,4,9] 
Prelude Control.Lens> [[0, 1], [4, 5], [9, 1]] ^.. each . ix 0 
[0,4,9] 

दोनों में से किसी का उपयोग कर सकते ठीक है कि तुम क्या लिखा है, असुरक्षित (^?!) ऑपरेटर, कि यह एक त्रुटि दे सकते हैं जिसका मतलब है कि उपयोग करने के लिए। खाली सूचियों को छोड़कर दूसरा सुरक्षित है।

वे कुछ अलग तरीकों से काम: पहली बार अपने मूल संरचना है, जो map क्या करता है के लिए और अधिक मेल खाती है का एक संशोधित संस्करण बनाता है, और यह संरचनाओं कि सूचियों नहीं हैं पर इस्तेमाल किया जा सकता है।

दूसरा प्रदान की गई लेंस फोल्ड का उपयोग करके आपकी संरचना का एक सारांश सारांश बनाता है; हालांकि इसका उपयोग कई प्रकार के ढांचे के साथ किया जा सकता है, परिणाम हमेशा एक सूची है।

तुम भी eachtraverse से (के रूप में @danidiaz बताते हैं, थोड़ा और अधिक सामान्य traversed या,) इस में बदल सकते हैं। पूर्व कई विशेष चीजों जैसे टुपल्स के लिए काम करता है, जबकि बाद में Traversable के लिए काम करता है।

+1

शायद आप 'ट्रैवर्स' के बजाय 'Control.Lens.Traversal' से' ट्रैवर्स 'का मतलब है? – danidiaz

+2

@ डांडिडियाज़ नोप, मेरा मतलब है 'ट्रैवर्स'। हालांकि यह * लेंस से * नहीं है, इसे इसके एक अनिवार्य हिस्से माना जाता है। –

+0

@danidiaz ओह मैं देखता हूं, * दोनों * यहां काम करते हैं। ऐसा लगता है कि 'ट्रैवर्सड' अधिक सामान्य है, सूचकांक की इजाजत देता है। –

संबंधित मुद्दे