2011-10-11 16 views
10

कक्षा PartialFunction[A, B] पर निम्नलिखित हस्ताक्षर के साथ कोई विधि क्यों नहीं है?पार्टिकल फ़ंक्शन पर कोई ऑरसे विधि क्यों नहीं है जो कुल फ़ंक्शन स्वीकार करती है?

def orElse[A1 <: A, B1 >: B](that: A1 => B1): A1 => B1 

क्या इस विधि की अनुपस्थिति के पीछे कुछ तार्किक कारण है, या यह केवल एक निरीक्षण था?

उत्तर

10
  1. क्योंकि यह आंशिक समारोह

    partialFunc.lift(arg) getOrElse (totalFunc(arg))

  2. क्योंकि स्काला, आम तौर पर अधिक भार से बचने की कोशिश करता है उठाने से ही प्राप्त करने के लिए तुच्छ है

  3. क्योंकि कोई भी इसे जोड़ने के लिए सोचा था, और शायद इसकी आवश्यकता नहीं है अब तक

  4. क्योंकि प्रत्येक एक घ हर विधि मानक लाइब्रेरी में जोड़ नीचे की ओर रखरखाव

+2

+1। जवाब के लिए धन्यवाद। अपने बुलेटों को जवाब देना ... 1) यह बहुत रचनात्मक नहीं है, और मुझे उल्लेख करता है और 'arg' दोहराता है। इसके अलावा यदि हम एक तर्क के रूप में कार्यान्वयन की तुच्छता का उपयोग करते हैं, तो स्कैला stdlib को अपने वर्तमान आकार के लगभग आधा तक छीनना होगा। :-) 2) उचित बिंदु। 3) मुझे पिछले तीन दिनों में इसे दो बार चाहिए था। 4) यह जोड़ने के लिए एक छोटी सी विधि है (जैसा कि आपने दिखाया था)। मुझे नहीं लगता कि यह किसी भी ध्यान देने योग्य रखरखाव ओवरहेड जोड़ देगा। – missingfaktor

+0

@missingfaktor आप नहीं कर सकते '(pf.lift <*> f) {_ getOrElse _} तर्क लागू करें या कुछ ऐसा ही है? –

+1

@oxbow_lakes: हाँ, मैं इसे इस तरह से कर सकता था, लेकिन यह अभी भी मेरे स्वाद के लिए वर्बोज़ (और गुप्त) है। – missingfaktor

1

पर विचार करने के मामले में हमेशा से विकसित लागत आती,

scala> object O { 
    | def f(g: Int => Int) = g(1) 
    | def f(g: PartialFunction[Int, Int]) = g(2).toString 
    | } 
defined module O 

scala> O f { _ * 1 } 
res3: Int = 1 

तो, आप आंशिक कार्यों अब श्रृंखला करते हैं? या, दूसरे शब्दों में, अगर अधिभार आप का वर्णन पुस्तकालय में था, और मैं यह लिखा:

type PF = PartialFunction[Any, Int] 
val pf1: PF = { case n: Int => n } 
val pf2: PF = pf1 orElse { case x: String => x.length } 
val pf3: PF = pf2 orElse { case d: Double => d.toInt } 

मैं प्रकार की अस्पष्टता की वजह से pf2 पर एक त्रुटि संदेश मिलता था। तो इसके बजाय, मैं लिखने:

val pf2 = pf1 orElse ((_: Any) match { case x: String => x.length }) 
val pf3 = pf2 orElse ((_: Any) match { case d: Double => d.toInt }) 

तब मैं, pf3 पर कोई त्रुटि मिलती है क्योंकि pf2 एक Function1 हो जाएगा।

+0

मुझे प्रश्न समझ में नहीं आया। :(क्या आप कृपया विस्तृत कर सकते हैं? – missingfaktor

+0

अब मैं आपके बिंदु को समझता हूं। मुझे नाम के बारे में ज्यादा परवाह नहीं है। वे इसे किसी अन्य नाम के तहत जोड़ सकते थे। – missingfaktor

+0

@missingfaktor आह, ठीक है। मैं सुझाव देता हूं 'अन्यथा' .-) –

0

ऐसा प्रतीत होता है कि मानक पुस्तकालय में इन कार्यों की अनुपस्थिति के अलावा निरीक्षण के अलावा कोई भी अच्छा कारण नहीं है या शायद किसी को भी उन्हें मानक लाइब्रेरी में रखने की आवश्यकता नहीं है।

मैंने A => B से PartialFunction[A, B] पर एक अंतर्निहित रूपांतरण परिभाषित किया है जो इस और अन्य समान मामलों का ख्याल रखता है, और इससे प्रतिकूल प्रभाव नहीं पड़ता है।

scala> implicit def fToPf[A, B](f: A => B) = new PartialFunction[A, B] { 
    | def isDefinedAt(a: A) = true 
    | def apply(a: A) = f(a) 
    | } 
fToPf: [A, B](f: A => B)java.lang.Object with PartialFunction[A,B] 
संबंधित मुद्दे