2012-05-02 8 views
7

हास्केल में यह शानदार जेनेरिक ट्रैवर्सल सामान है जो आपको संग्रह में प्रत्येक नोड पर map जैसे कुछ कॉल करने देता है, या तो नीचे-ऊपर या ऊपर-नीचे। इसे everywhere कहा जाता है और आप everywhere f tree और f जैसे कुछ ऐसा करेंगे जो आपके पेड़ में प्रत्येक नोड पर कॉल किया जाएगा।स्केल में समकक्ष आपके बॉयलरप्लेट को स्क्रैप करें?

Traversable के लिए कुछ स्काला में बराबर लेखन आसान है, लेकिन हास्केल के भी tuples पर काम करता है और मामले वर्ग या, के बराबर अधिक सामान्य रूप से, क्या स्काला कॉल Product रों।

आप productIterator विधि का उपयोग कर एक Product में तत्वों के ऊपर पार कर सकते हैं, लेकिन वहाँ एक बार आप निर्माता (वास्तव में, मुझे लगता है apply के लिए क्या तर्क पता कुछ आसान तरीका वापस एक साथ एक टपल या एक मामले वर्ग डाल करने के लिए है विधि) होना चाहिए?

def mapOnProduct[X](f: X -> X, prod: Product) { 
    val newArgs = prod.productIterator.map { 
    case x: X => f(x) 
    case id => id 
    }.toList 
    [?].apply(newArgs: _*) 
} 

क्या मैं इतना है कि यह काम करने का कुछ मौका है साथ [?] जगह ले सकता है?

धन्यवाद!

उत्तर

6

माइल्स सबिन के बेकार Shapeless देखें। sybclass test

+0

में हर जगह के उपयोग का एक उदाहरण है जो मैं खोज रहा था। धन्यवाद! – TOB

+0

क्या यह एक मनमाना केस क्लास ले सकता है और इसके पैरामीटर के फ़ंक्शन के आधार पर एक नया उदाहरण लौटा सकता है, और उत्पाद के सभी उदाहरणों के साथ काम करता है, या यह सिर्फ टुपल्स तक ही सीमित है? –

+0

@ लुइगीप्लिंग: यह मामला कक्षाओं के साथ भी काम करता है, कम से कम आकारहीन 2.0 के बाद, मैक्रोज़ के लिए धन्यवाद। एक अच्छा उदाहरण है [यहां] (https://github.com/milessabin/shapeless/blob/e3399e35a7bb17b286141f53827619a3dc98efe8/examples/src/main/scala/shapeless/examples/sybclass.scala#L65)। – Blaisorblade

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