2013-01-01 27 views
8

मैं स्केल के इन्स और आउट सीखने पर काम कर रहा हूं, और हाल ही में मैं कुछ ऐसी चीज में आया हूं जिसके बारे में मैं उत्सुक हूं।स्कैला: सूची क्यों नहीं है [=> Int] काम करता है?

मैं समझता हूँ के रूप में,, (मौके पर यह मूल्यांकन करने के बिना) मैं टाइप कर सकते हैं अगर मैं कोड का एक खंड है कि प्रभावी ढंग से lazily एक समारोह के लिए मूल्यांकन किया जाता है पास करना चाहते हैं:

def run(a: =>Int):Int = {...} 

इस अर्थ में, फ़ंक्शन रन को कोड का एक ब्लॉक प्राप्त होता है, जिसका मूल्यांकन अभी तक किया जाना है, जिसका मूल्यांकन यह गणना करता है और गणना की गई Int का देता है। मैंने फिर इस विचार को सूची डेटा संरचना में विस्तारित करने का प्रयास किया। लेखन:

def run(a: List[=>Int]) = {...} 

यह तथापि, एक त्रुटि देता है। मैं सोच रहा था कि यह क्यों अस्वीकृत है। कैसे, इस वाक्यविन्यास के अलावा मैं कोड के अनियमित ब्लॉक की एक सूची पास कर सकता हूं?

उत्तर

8

=>Int नाम पैरामीटर के लिए वाक्यविन्यास है। =>Int एक प्रकार नहीं है, इसलिए इसे List पर पैरामीटर के रूप में उपयोग नहीं किया जा सकता है। हालांकि, ()=>Int एक प्रकार है। यह nullary फ़ंक्शंस का प्रकार है जो Int लौटाता है। तो यह काम करता है:

def run(a: List[()=>Int]) = {...} 
+0

आह! ऐसा करना चाहिए, उत्तर किम के लिए धन्यवाद। द्वारा, क्या JVM ने एक अज्ञात फ़ंक्शन डाला है, जैसे उपरोक्त सूची में संग्रहीत किए जा रहे हैं, ढेर में? –

+0

हां, वे ढेर पर संग्रहीत हैं। –

5
+1

एक और विकल्प 'स्ट्रीम' का उपयोग करना है, जो एक आलसी डेटा संरचना भी है। – folone