2011-03-19 18 views
5

स्कैला में कल टुपल्स के बारे में कल एक प्रश्न के कुछ उपयोगी उत्तर के परिणामस्वरूप, मैं स्कैला एचलिस्ट देख रहा हूं। मैं उस सवाल से दूसरे प्रश्न पूछने के लिए एक सी ++ उदाहरण फिर से हैश करना चाहता हूं:स्कैला संकलन-समय रिकर्सन?

सी ++ में कोई भी टेम्पलेट विशेषज्ञता का उपयोग करके संकलित-समय रिकर्सन को कार्यान्वित कर सकता है। मैंने अक्सर इस ऑपरेटिंग को बूस्ट टुपल्स पर किया है, जैसे स्काला/हास्केल एचएलिस्ट्स को सामान्य 'विपक्ष' प्रकार को कई बार लिखकर बनाया जाता है, एक बार प्रत्येक प्रासंगिक प्रकार के लिए और null_type के साथ समाप्त होता है। तो यह:

boost::tuple<int, std::string, float> 

के रूप में हुड के नीचे कार्यान्वित किया जाता है:

cons<int, cons<std::string, cons<float, null_type> > > 

हम तो यह है कि इस संरचना पर संकलन समय पर recurse कार्यों की एक जोड़ी लिख सकते हैं समाप्त जब दूसरा, और अधिक-विशेष फ़ंक्शन अंतिम विपक्ष प्रकार से मेल खाता है। एक साधारण उदाहरण, गिनती तत्वों की संख्या नीचे दिखाया गया है:

template<typename T1, typename T2> 
void countTupleElements(boost::tuples::cons<T1, T2>& tupleRec, int index, const std::vector<std::string>& vals) 
{ 
    return 1 + countTupleElements(tupleRec.tail); 
} 

template<typename T> 
void countTupleElements(boost::tuples::cons<T, boost::tuples::null_type>& tupleRec, int index, const std::vector<std::string>& vals) 
{ 
    return 1; 
} 

महत्वपूर्ण बात यह पैटर्न अक्सर परिस्थितियों में प्रयोग किया जाता है जहाँ आप विभिन्न टपल तत्व प्रकार (मेरे उदाहरण में सचित्र नहीं) से प्रत्येक के लिए कुछ अलग करना चाहते हैं : सी ++ संकलन-समय रिकर्सन आवश्यक है क्योंकि एक बार कोड चल रहा है, सभी उपयोगी उद्देश्यों के लिए प्रकार की जानकारी खो जाती है।

मेरा सवाल है, स्कैला एचएलिस्ट के साथ कुछ ऐसा संभव है, उदा।

val example = 1 :: 2.0 :: "Hello" :: "World" :: HNil 

मुझे पता है कि स्काला, JVM पर चल रहा है, प्रतिबिंब है हूँ - और इसलिए शायद इस एक समारोह में प्रकट होता है और पैटर्न मिलान का उपयोग कर के साथ चलाने के समय प्रत्यावर्तन का उपयोग कर लागू किया जा सकता। लेकिन मुझे यह जानने में दिलचस्पी है कि संकलन-समय रिकर्सन का उपयोग करते हुए सी ++ उदाहरण के समान कुछ करना संभव है या नहीं?

+0

मुझे यकीन नहीं है कि यहां क्या पूछा जा रहा है। लेकिन आपके सवालों की सामान्य प्रवृत्ति को देखते हुए, मुझे आश्चर्य है कि क्या आपने स्कैला प्रकार प्रणाली में चर्च अंकों के बारे में ब्लॉगों को देखा है? या स्कैला प्रकार प्रणाली में एसकेआई कैलकुलस? –

+0

धन्यवाद डैनियल। आपके विभिन्न सुझाव बहुत उपयोगी साबित हो रहे हैं। मैं प्रेरणा के लिए ScalaQuery स्रोत में चारों ओर खुदाई कर रहा हूं। –

+0

क्या आप अधिक दिलचस्प प्रकार के मामले का उदाहरण जोड़ सकते हैं "जहां आप विभिन्न ट्यूपल तत्व प्रकारों में से प्रत्येक के लिए कुछ अलग करना चाहते हैं"? –

उत्तर

2

गहराई में नई किताब स्काला यहोशू Suereth द्वारा में इस का एक उत्कृष्ट उदाहरण है। धारा 7.4 "प्रकार प्रणाली का उपयोग कर सशर्त निष्पादन" है और यह एचएलआईस्ट निर्माण का परिचय देता है और आप इंडेक्सड व्यू प्रकार को लागू करने के लिए संकलन समय रिकर्सन का उपयोग कैसे कर सकते हैं जो एचएलिस्ट के विशिष्ट तत्व तक पहुंच सकता है। इसका उपयोग एटिंडेक्स प्रकार को लागू करने के लिए किया जाता है जिसका उपयोग संकलन समय पर व्यक्तिगत मानों को पुनर्प्राप्त करने के लिए किया जाता है।

0

हाँ आप कर सकते हैं। सबसे सामान्य मामले के लिए स्कैला के प्रकार सिस्टम में SKI calculus को कार्यान्वित करने के तरीके के बारे में मेरा ब्लॉग पोस्ट देखें। मैंने loop unrolling and conditional compilation के अधिक विशिष्ट मामले के बारे में भी लिखा है। आखिरकार solution इस छोटे से puzzle में एक तरह का सार दिखाता है कि संकलन समय रिकर्सन कैसे कार्यान्वित किया जा सकता है।

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