2017-06-19 8 views
9

मैं एक ट्रैवर्सल फ़िल्टर करना चाहता हूं, फिर over के साथ उपयोग करने के लिए अंतिम तत्व का चयन करें।'फ़िल्टर किए गए' के ​​अंतिम तत्व पर ट्रैवर्सल

उदा। इस तरह कुछ (लेकिन जो वास्तव में संकलित होगा):

[1,2,3,4] & traverse . filtered even . _last +~ 10 
> [1,2,3,14] 

कोई विचार?

पीएस मुझे पता है कि filtered केवल तभी वैध है जब ट्रैवर्सल में तत्वों की संख्या को प्रभावित नहीं किया जाता है।

वास्तविक उपयोग केस जो मैं कर रहा हूं वह केवल रिकर्सिव uniplate ट्रैवर्सल का निम्नतम स्तर चुनना है जो कुछ पूर्वानुमान से मेल खाता है; अगर आपके पास ऐसा करने के बारे में अन्य विचार हैं तो मुझे उन्हें सुनना अच्छा लगेगा!

+0

मुझे रिवर्स स्टेट मोनैड ट्रांसफार्मर में ट्रैवर्स करके ऐसा करने में एक दरार थी, लेकिन यह आपको 'मोनाडफिक्स एम => का हस्ताक्षर देता है। ट्रैवर्सल 'एस -> लेंसलाइक' एमएसए 'जो बहुत उपयोगी नहीं है - आप केवल इसमें मूल्य डाल सकते हैं, उन्हें बाहर नहीं निकाल सकते, क्योंकि' कॉन्स्ट एस 'एक' मोनाड 'नहीं है। एक वैकल्पिक दृष्टिकोण संग्रह की लंबाई को फोल्ड करके प्राप्त करना होगा और फिर अंतिम सूचकांक तक राज्य की गणना करना होगा - जो आपको कुछ दक्षता के खर्च पर 'मोनाडफ़िक्स' के बजाय 'मोनाड' बाधा प्रदान करेगा। कंक्रीट सूची के माध्यम से जाना, जैसा कि @ गुर्केंग्लास के उत्तर में है, शायद आपकी सबसे अच्छी शर्त है –

उत्तर

1

यह वास्तव में एक उत्तर नहीं है, बस @ गुर्केंग्लास के लिए एक अनुवर्ती है जो एक टिप्पणी के लिए बहुत बड़ा है। ध्यान दें कि @ Gurkenglas का जवाब:

let t = partsOf (traverse . filtered even) . _last 

एक Traversal तरह लग सकता है, लेकिन ऐसा नहीं है, भले ही आप, तत्व गिनती बनाए रखने क्योंकि यह (स्पष्ट कारणों के लिए) दूसरा Traversal कानून का उल्लंघन करती:

let f = Identity . succ 
[1,2,3,4] & fmap (t f) . t f -- yields [1,3,3,5] effectively 
[1,2,3,4] & getCompose . t (Compose . fmap f . f) 
           -- yields [1,2,3,6] effectively 

यह एक ट्रेवर्सल होने के लिए, आप तत्व गिनती और अपरिवर्तनशीलताओं के रूप में छानने संपत्ति दोनों बनाए रखने के लिए किया है।

इस आपके आवेदन के लिए कोई फर्क होगा या नहीं, मैं नहीं पता है, लेकिन सिर्फ पता है कि partsOf चेतावनियां के इन प्रकार के साथ आता है, और प्रलेखन गुमराह पता चलता है कि partsOf का परिणाम एक लेंस अगर आप तत्व को बनाए रखने के लिए किया जाएगा गिनती। (यह partsOf each के लिए सच है, दस्तावेज में दिया गया उदाहरण, लेकिन सामान्य रूप से नहीं।)

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