2011-08-25 14 views
9

मुझे बाहरी संसाधन से लोड की गई वस्तुओं का अनुक्रम बनाने की आवश्यकता है। यह लोडिंग एक महंगा ऑपरेशन होने के कारण वस्तुओं की आवश्यकता होने तक देरी होनी चाहिए। संग्रह के निर्माण के बाद, मुझे निहित वस्तुओं के लिए अनुक्रमित पहुंच की आवश्यकता है। क्या स्कैला मानक पुस्तकालय इस उपयोग के मामले के लिए उपयुक्त संग्रह प्रदान करता है? यदि नहीं, तो इसे लागू करने का सबसे अच्छा तरीका क्या होगा?आलसी मूल्यांकन अनुक्रमित अनुक्रम प्रकार

संपादित करें:
अनुक्रमित देखने अधिमानतः एक हे (1) आपरेशन होना चाहिए।

उत्तर

9

अजीब, माइल्स हाल ही में tweeted about this। एक जवाब तब Needको स्केलज़ में Name.scala के पर इंगित करता है और दूसरा अंक चश्मा 'LazyParameter पर इंगित करता है।

की आवश्यकता के साथ थोड़ा परीक्षण:

import scalaz._ 
import Scalaz._ 
val longOp = { var x = 0;() => {println("longOp"); x += 1; x }} 
val seq = Seq(Need(longOp()), Need(longOp())) 
val sum = seq.map(_.value).sum 
val sum = seq.map(_.value).sum 

val v = Need(longOp()) 
val s = v.map("got " + _) 
println(s.value) 
println(s.value) 

प्रिंट:

longOp:() => Int = <function0> 
seq: Seq[scalaz.Name[Int]] = List(
    [email protected], [email protected]) 
longOp 
longOp 
sum: Int = 3 
sum: Int = 3 
v: scalaz.Name[Int] = [email protected] 
s: scalaz.Name[java.lang.String] = [email protected] 
longOp 
got 3 
got 3 

तो longOp केवल मूल्य के पहले पहुँच पर एक बार कहा जाता है।

+0

बहुत बहुत धन्यवाद, मैं मुझे याद दिलाने में असमर्थ था कि मैंने इसे पहले देखा है। प्रतीत होता है कि – Nicolas

+0

'नाम' प्रत्येक पहुंच पर 'मान' का मूल्यांकन कर रहा है: http://paste.pocoo.org/show/464187/। यह अवांछनीय है। – missingfaktor

+1

@missingfaktor, हाँ - फ़ाइल के अंत में * आवश्यकता * छुपा * उपयोग करें। – huynhjl

2

ऐसा लगता है कि आप Stream चाहते हैं।

+0

स्ट्रीम एक आलसी सूची है, और स्ट्रीम में अनुक्रमित पहुंच एक 'ओ (एन)' ऑपरेशन है। मुझे इंडेक्स-आधारित लुकअप के लिए 'ओ (1)' प्रदर्शन विशेषताओं के साथ कुछ चाहिए। – missingfaktor

+1

आपको अपने प्रश्न पर यह प्रदर्शन विचार जोड़ना चाहिए। यह एक महत्वपूर्ण तत्व है। – Nicolas

+0

@ निकोलस: जोड़ा गया। धन्यवाद। – missingfaktor

5

मेरे ज्ञान के लिए, मानक पुस्तकालय में फिट कुछ भी नहीं है। एक समाधान अपने वस्तुओं के लिए लेज़ी आवरण का एक प्रकार का उपयोग करने के हो सकता है:

class Lazy[A](operation: => A) { 
    lazy val get = operation 
} 

और फिर आप उपयोग करना चाहते हैं संग्रह के किसी भी प्रकार के साथ अपने Collection[Lazy[A] निर्माण कर सकते हैं।

+0

+1, यह वही है जो मैंने वर्तमान में तय किया है। (सिवाय इसके कि मेरा 'get' 'unary_ है!' :-) मैंने सोचा कि कुछ बेहतर विकल्प हो सकता है, या तो स्टेडलिब के कुछ छिपे हुए कोनों में या स्कालाज़ में। – missingfaktor

+0

यह स्केलज़ में कुछ हो सकता है, मैं इससे परिचित नहीं हूं। – Nicolas