पर विचार करने के मामले में हमेशा से विकसित लागत आती,
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
हो जाएगा।
स्रोत
2011-10-12 23:04:10
+1। जवाब के लिए धन्यवाद। अपने बुलेटों को जवाब देना ... 1) यह बहुत रचनात्मक नहीं है, और मुझे उल्लेख करता है और 'arg' दोहराता है। इसके अलावा यदि हम एक तर्क के रूप में कार्यान्वयन की तुच्छता का उपयोग करते हैं, तो स्कैला stdlib को अपने वर्तमान आकार के लगभग आधा तक छीनना होगा। :-) 2) उचित बिंदु। 3) मुझे पिछले तीन दिनों में इसे दो बार चाहिए था। 4) यह जोड़ने के लिए एक छोटी सी विधि है (जैसा कि आपने दिखाया था)। मुझे नहीं लगता कि यह किसी भी ध्यान देने योग्य रखरखाव ओवरहेड जोड़ देगा। – missingfaktor
@missingfaktor आप नहीं कर सकते '(pf.lift <*> f) {_ getOrElse _} तर्क लागू करें या कुछ ऐसा ही है? –
@oxbow_lakes: हाँ, मैं इसे इस तरह से कर सकता था, लेकिन यह अभी भी मेरे स्वाद के लिए वर्बोज़ (और गुप्त) है। – missingfaktor