2012-02-24 8 views
6

इस प्रश्न का उत्तर देने का प्रयास करते समय: Leave off underscore in function literal मैंने एक उदाहरण कोड करने की कोशिश की और मुझे एक अजीब व्यवहार का सामना करना पड़ा।स्कैला: अंडरस्कोर से बचने के दौरान उलटा परिणाम :::

scala> val myList = 1::2::Nil 
myList: List[Int] = List(1, 2) 

scala> def concat:(List[Int]=> List[Int]) = myList::: 
concat: (List[Int]) => List[Int] 

scala> concat(3::Nil) 
res1: List[Int] = List(3, 1, 2) 

जब मैं _ या x=> f(x) वाक्यविन्यास का उपयोग जब मैं अच्छा जवाब दिया है।

scala> def concat0:(List[Int]=> List[Int]) = x=> myList:::x 
concat0: (List[Int]) => List[Int] 

scala> def concat1:(List[Int]=> List[Int]) = myList::: _ 
concat1: (List[Int]) => List[Int] 

scala> concat0(3::Nil) 
res2: List[Int] = List(1, 2, 3) 

scala> concat1(3::Nil) 
res3: List[Int] = List(1, 2, 3) 

वहाँ एक तर्कसंगत व्याख्या क्यों myList समारोह concat में 3::Nil के बाद आता है है?

उत्तर

7

myList ::: __.:::(myList) पर अनुवाद करता है, जबकि myList :::myList.:::(_) पर अनुवाद करता है।

tl; डॉ

This post सही साहचर्य तरीकों के बारे में और अधिक विस्तार में चला जाता है। यहाँ क्या हो रहा है है: अगर प्रकार के List[Int]

  • List एक ::: विधि
  • क्योंकि सही संबद्धता का नियमों का
  • है

    • def concat0:(List[Int]=> List[Int]) = x=> myList:::x
      • स्काला संकलक है कि एक्स अनुमान लगा सकते हैं, इस x.:::(myList) में बदल जाता है , जो myList से x पर प्रीपेड करता है।
    • डीईएफ़ concat: (सूची [इंट] => सूची [इंट]) = MyList :::
      • myList के प्रकार यदि List[Int]
      • वहाँ ::: का कोई दाहिने हाथ की ओर है, इसलिए वहाँ है कोई सही-सहयोगीता
      • इसके बजाय, कंपाइलर एक अनुमान लगाता है। myList और
      • myList.::: के बीच :::x => myList.:::(x), जो myList को x पहले जोड़ता के समान है।
  • +0

    वास्तव में विस्तृत और स्पष्ट पोस्ट के लिए धन्यवाद। –

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