2012-03-04 13 views
8

क्या स्कैला में आंशिक फ़ंक्शन का डोमेन प्राप्त करना संभव है?स्कैला में आंशिक फ़ंक्शन का डोमेन कैसे प्राप्त करें?

पूर्व:

val list = f.getDomain 

जो मान 1 और 2 का संकेत होगा:

val f: PartialFunction[Int, Unit] = { 

     case 1 => println("This is 1") 

     case 2 => println("This is 2") 

    } 

वहाँ किसी भी तरह से की तरह कुछ पाने के लिए है?

अद्यतन: मैं एक अधिसूचना प्रणाली (घटना बस) बनाने की कोशिश कर रहा हूं। ग्राहक इस तरह दिखेगा:

class SomeSubscriber extends Subscriber { 

    notifications { 

     case LoginEvent(date) => println("Login on " + date) 

     case LogoutEvent(date) => println("Logout on " + date) 

     case e: Notification[Any] => async { 

     println("Other notification: " + e) 

     ui { 

      println("UI in async! " + e) 

     } 

     } 

    } 

    } 

मेरी NotiticationService में (घटना डिस्पैचर) मैं घटनाओं हर 'सूचनाएं' ब्लॉक में घोषित तो मैं ग्राहकों के लिए पुश सूचनाएं कर सकते हैं का उपयोग करना चाहते हैं। मैं उसे कैसे कर सकता हूँ?

अग्रिम धन्यवाद।

+9

मैं नहीं देख सकता कि यह कैसे संभव हो सकता है (गणना की उचित मात्रा में, वैसे भी। केवल आंशिक कार्यों पर परिभाषित आंशिक फ़ंक्शन पर विचार करें (इसलिए डोमेन को सभी प्रमुख संख्याएं वापस करने की आवश्यकता होगी) –

+0

आपको वहां एक बिंदु मिला। मैं सोच रहा था कि स्कैला कंपाइलर किसी भी तरह मेरी मदद करने में सक्षम होगा (मेरे उदाहरण में डोमेन को पुनर्प्राप्त करना आसान होना चाहिए)। धन्यवाद। – d4rkang3l

+1

यदि आप डोमेन तक पहुंच चाहते हैं, तो इसके बजाय 'मानचित्र' का उपयोग करें। – ziggystar

उत्तर

11

आप एक संग्रह है, और आप को पता है जो तत्व भी f के डोमेन के हैं चाहते हैं, तो आप ऐसा तरह filter और isDefinedAt उपयोग कर सकते हैं:

scala> 1 to 10 filter f.isDefinedAt 
res1: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2) 

यह केवल विस्तृत रूप से जाँच करता है। मुझे नहीं पता कि कोई बेहतर तरीका है या नहीं।

+0

मैं उस पर विचार कर रहा था, लेकिन हालांकि शायद एक और तरीका है। – d4rkang3l

4

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

+0

मुझे लगता है कि 'निश्चित' डोमेन मानों को ढूंढने का विकल्प होना उपयोगी होगा (सरल मूल्यों पर निश्चित I मतलब केस द्वारा)। या शायद डोमेन की कुछ श्रेणियों को पुनः प्राप्त करने के लिए। – d4rkang3l

+1

इसे कंपाइलर कोड में कुछ बहुत बदसूरत हैक की आवश्यकता होगी और सामान्य मामले में भी असंभव करना होगा। व्यक्तिगत स्तर पर मुझे नहीं लगता कि यह कुछ मामलों के मुकाबले उपयोगी होगा; ऐसा करने के लिए क्लीनर तरीके हैं (जैसे मानचित्र में सभी समर्थित 'निश्चित' मानों को पंजीकृत करना, प्रति ज़िगजिस्टर की टिप्पणी प्रति)। –

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