2013-08-03 10 views
6

मैं जोशुआ सुएरेथ द्वारा «गहराई में स्केल» पढ़ रहा हूं, पुस्तक जिसे मैंने लेखक की स्पष्ट रूप से स्थापित योग्यता के लिए खरीदा है। मैं पेज 3 पर हूं और टाइपो और असंगत स्वरूपण के समूह के बाद (ठीक है, मैं इन त्रुटियों का सहिष्णु बन गया हूं) मैंने एक बहुत ही सरल परिदृश्य को हल करने के लिए एक कार्यात्मक दृष्टिकोण के बारे में निम्नलिखित उदाहरण पर ठोकर खाई।स्कैला एपीआई 2.10। *: फंक्शन 2.और फिर क्या हुआ?

trait Cat 
trait Bird 
trait Catch 
trait FullTummy 

def catch(hunter: Cat, prey: Bird): Cat with Catch 
def eat(consumer: Cat with Catch): Cat with FullTummy 

val story = (catch _) andThen (eat _) 
story(new Cat, new Bird) 

मैं उदाहरण ले लिया सावधानी के साथ प्रदान की यह स्पष्ट रूप से एक नीली प्रिंट (कोई ठोस तरीकों परिभाषित कर रहे हैं ...) ... «पकड़» स्पष्ट रूप से एक और टाइपो बशर्ते वह एक आरक्षित शब्द है ... Cat और Bird instantiable नहीं हैं है ...

... लेकिन एक और आकस्मिक गलती यह प्रदान, उदाहरण की खराब गुणवत्ता के बावजूद, मैं विचार नहीं कर सकता कि «कहानी» वैल समारोह रचना के संदर्भ में परिभाषित (andThen «रिवर्स साहचर्य» compose की है) है उदाहरण के कोर

प्रभावी रूप से उदाहरण स्कैला (2.10.1) के मेरे स्थानीय संस्करण पर संकलित नहीं होगा और यह उपलब्ध नवीनतम संस्करण (2.10.2) पर दस्तावेज नहीं है।

(अनुसरण करें) इसकी उपयोगिता की और कहा कि इसके कार्यान्वयन को पूरा करने के लिए आसान है कोई संदेह नहीं है:

trait Function2ex[-T1, -T2, +R] extends Function2[T1, T2, R] { 
    def andThen[A](g: R => A): (T1, T2) => A = { (x, y) => g(apply(x, y)) } 
} 

एपीआई मैंने पाया की एक छोटी सी जांच के बाद कि andThen केवल Function1 द्वारा और माना जाता है कि गायब हो गया समर्थित है Function2 से Function22 को हां, तो सवाल यह है:

वर्तमान मुहावरा 1 से अधिक arity के समारोह के साथ * andThen और compose समर्थन करने के लिए क्या है?

उत्तर

5

मुझे समझ में नहीं आता कि यह उदाहरण कहां चल रहा है, लेकिन यहां कुछ कोड है जो स्केल 2.10.2 में संकलित है।

trait Cat 
trait Bird 
trait Catch 
trait FullTummy 

def `catch`(hunter: Cat, prey: Bird): Cat with Catch = ??? 
def eat(consumer: Cat with Catch): Cat with FullTummy = ??? 

val story = (`catch` _).tupled andThen (eat _) 
story(new Cat with Catch, new Bird {}) 

मैं catch बोली, क्योंकि यह एक आरक्षित शब्द है, और Function2 टपल करना पड़ा।

+0

क्या आप कृपया tupled के बारे में विस्तार से बता सकते हैं। आपको इसका उपयोग क्यों करना पड़ा (मुझे पता है कि यह अन्यथा काम नहीं करता है, लेकिन हमें इसे क्यों करना है, क्योंकि खाने को एकल पैरामीटर "उपभोक्ता" के बजाय टुपल स्वीकार नहीं किया जाता है)? और क्या यह वास्तव में – igx

+1

हम इसे टपल क्योंकि '(\' पकड़ \ '_)' एक 'Function2' है, जो एक' andThen' विधि नहीं है है कर रही है। और रिटर्न टाइप ('कैट विद कैच') को 'खाने' के तर्क प्रकार से मेल खाना पड़ेगा। –

+0

इसलिए हम वास्तव में tupled आदेश "andthen" समारोह, सही पाने के लिए Function1 करने के लिए इसे परिवर्तित करने के लिए उपयोग कर रहा? – igx

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