2011-12-01 18 views
6

मैं एक सापेक्ष स्कैला शुरुआती हूं और एक कार्यान्वयन पर आगे बढ़ने के बारे में कुछ सलाह चाहूंगा जो ऐसा लगता है कि इसे फ़ंक्शन रिटर्निंग विकल्प या पार्टियल फ़ंक्शन के साथ किया जा सकता है। मैंने उन सभी संबंधित पदों को पढ़ा है जिन्हें मैं पा सकता हूं (प्रश्न के नीचे देखें), लेकिन इनमें आंशिक कार्य का उपयोग करने या एक दूसरे को परिवर्तित करने के तकनीकी विवरण शामिल हैं; मैं इस प्रकार के उत्तर की तलाश में हूं "यदि परिस्थितियां एक्स, वाई, जेड हैं, तो ए और बी का उपयोग करें, लेकिन सी पर भी विचार करें"।स्कैला: फ़ंक्शन रिटर्निंग विकल्प का चयन करना आंशिक फ़ंक्शन

मेरा उदाहरण उपयोग केस पथ खोजकों की लाइब्रेरी का उपयोग करके स्थानों के बीच पथ खोज है। मान लें कि स्थान L प्रकार हैं, एक पथ P प्रकार था और वांछित पथ खोज परिणाम Iterable[P] होगा। पैच खोज परिणाम को सभी पथ खोजकर्ताओं (Google मानचित्र जैसे कुछ में साइकिल, कार, वॉक, सबवे इत्यादि) में उनके पथ सुझावों के लिए इकट्ठा किया जाना चाहिए, जो कि किसी विशेष प्रारंभ के लिए परिभाषित किया जा सकता है या नहीं/अंत स्थान जोड़ी।

(क) f: (L,L) => Option[P] के रूप में एक पथ खोजक को परिभाषित करने और उसके बाद finders.map(_.apply(l1,l2)).filter(_.isDefined).map(_.get) की तरह कुछ के माध्यम से परिणाम प्राप्त

(ख) एक पथ खोजक f: PartialFunction[(L,L),P] and then get the result via something like के रूप में परिभाषित करते हैं:

इस बारे में जाने के लिए दो तरीके होने लगते हैं finders.filter (_.isDefined ((l1, l2))) .map (_.apply ((l1, l2))) `

ऐसा लगता है कि Option[P] लौटने वाले फ़ंक्शन का उपयोग करने से ऐसा लगता है कि परिणाम के दोहरे मूल्यांकन से बचें, इसलिए एक महंगी गणना के लिए यह तब तक बेहतर हो सकता है जब तक कि कोई नतीजे न पहुंचे। ऐसा लगता है कि Option का उपयोग करने के लिए एक मनमाने ढंग से इनपुट हस्ताक्षर हो सकता है, जबकि PartialFunction एक तर्क की अपेक्षा करता है। लेकिन मुझे स्कैला लाइब्रेरी के साथ बातचीत जैसे कम तत्काल, अधिक "बड़ी तस्वीर" विचारों के बारे में व्यावहारिक अनुभव वाले किसी व्यक्ति से सुनने में विशेष रूप से रूचि है। PartialFunction का उपयोग करना संग्रह एपीआई के कुछ तरीकों को उपलब्ध कराने में महत्वपूर्ण लाभ है जो अन्य तरीकों से भुगतान कर सकते हैं? क्या ऐसा कोड आम तौर पर अधिक संक्षिप्त होगा?

संबंधित लेकिन अलग अलग सवाल:

उत्तर

3

यह महसूस हो रहा है Option की तरह आपके उपयोग के मामले को बेहतर तरीके से फिट कर सकता है।

मेरी व्याख्या यह है कि आंशिक कार्य इनपुट श्रेणियों पर संयुक्त होने के लिए अच्छी तरह से काम करते हैं। तो अगर f(SanDiego,Irvine) से अधिक परिभाषित किया गया है और अधिक (Paris,London) तो आप एक समारोह है कि f orElse g करके संयुक्त इनपुट (SanDiego,Irvine) और (Paris,London) से अधिक परिभाषित किया गया है प्राप्त कर सकते हैं g परिभाषित किया गया है।

लेकिन आपके मामले में ऐसा लगता है, चीजों को एक दिया (l1,l2) स्थान टपल के लिए होता है और फिर आप कुछ काम करना ...

आप अपने आप को मिल जाए {case (L,M) => ... case (P,Q) => ...} का एक बहुत लिख तो यह है कि आंशिक कार्यों संकेत हो सकता है एक बेहतर फिट हैं।

अन्यथा विकल्पों संग्रह में से बाकी के साथ अच्छी तरह से काम करते हैं और अपने (क) प्रस्ताव के बजाय इस तरह इस्तेमाल किया जा सकता:

val processedPaths = for { 
    f <- finders 
    p <- f(l1, l2) 
} yield process(p) 
भीतर समझ p के लिए

एक Traversable में उठाया है, ताकि आप डॉन ' परिणामों के बिना खोजकर्ताओं को छोड़ने के लिए टी filter, isDefined या get पर भी कॉल करना होगा।

3

यह सब कुछ अच्छी तरह से ज्ञात नहीं है, लेकिन 2.8 स्कैला के पास collect विधि है जो इसके संग्रह पर परिभाषित है। collectfilter के समान है, लेकिन आंशिक कार्य करता है और आपके द्वारा वर्णित अर्थशास्त्र है।

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