2012-05-03 16 views
12

मैट्रिक्स डॉट उत्पाद करने के लिए http://www.scalaclass.com/book/export/html/1 से नीचे कोड।स्कैला मानचित्र विधि वाक्यविन्यास

मैं घुंघराले ब्रैकेट के बीच वाक्यविन्यास को समझ नहीं सकता।

  • घुंघराले ब्रैकेट का उपयोग क्यों किया जाता है, नियमित विधि कोष्ठक नहीं?
  • क्या कोई अज्ञात विधि नहीं है?
  • ._1 और ._2 क्या है?

धन्यवाद।

type Row = List[Double] 
type Matrix = List[Row] 

def dotProd(v1:Row, v2:Row) = 
    v1.zip(v2).map{ t:(Double, Double) => t._1 * t._2 }.reduceLeft(_ + _) 

उत्तर

28
  • घुमावदार ब्रैकेट का उपयोग क्यों किया जाता है, नियमित विधि कोष्ठक नहीं?

पैरामीटर एक अज्ञात फ़ंक्शन होने पर कुछ लोग घुंघराले ब्रेसिज़ का उपयोग करना पसंद करते हैं। एक बात के लिए, घुंघराले ब्रेसिज़ पैटर्न मिलान करने वाले अज्ञात कार्यों को सक्षम करते हैं, जबकि कोष्ठक नहीं करते हैं। इस विशेष उदाहरण में, घुंघराले ब्रेसिज़ की कोई आवश्यकता नहीं है।

def dotProd(v1:Row, v2:Row) = 
    v1.zip(v2).map{ case (a, b) => a * b }.reduceLeft(_ + _) 

ध्यान दें कि ऊपर समारोह प्रश्न में से एक है, एक से थोड़ा अलग तरह से के रूप में एक ही बात सिद्ध:

एक उदाहरण है जहाँ घुंघराले ब्रेसिज़ (case पैटर्न मिलान की वजह से) के लिए आवश्यक हैं है।

  • t एक अज्ञात विधि है?

नहीं, यह एक पैरामीटर है। v1 और v2dotProd के लिए पैरामीटर हैं, t अज्ञात फ़ंक्शन map पर पारित होने के लिए पैरामीटर है।

  • ._1 और ._2 क्या है?

t पर तरीके। आदि

एक _1, _2, _3,: पैरामीटर t एक टपल (विशेष रूप से, Tuple2[Double, Double], (Double, Double) के रूप में लिखा जा सकता है) के रूप में परिभाषित किया गया था, और tuples आप ऐसा तरीकों के साथ टपल के प्रत्येक सदस्य को निकालने जाने Tuple2 में केवल _1 और _2 है, ज़ाहिर है। ध्यान दें कि पहला पैरामीटर _1 है, _0 नहीं, अन्य कार्यात्मक भाषाओं के प्रभाव के कारण।

वैसे भी, zip विधि एक List[(Double, Double)] में (List[Double]) में परिवर्तित कर देंगे। विधि map एक ऐसा फ़ंक्शन लेता है जो सूची के तत्वों को परिवर्तित करता है (जो (Double, Double) टुपल्स हैं) कुछ और में।

+0

'._1' और' ._2' वास्तव में 'Tuple2' के तरीके हैं? मैं उन्हें फ़ील्ड होने के बारे में जानता था (जैसा कि 'टुप्लेएन' में '_1' से' _N' तक 'एन' फ़ील्ड होंगे, प्रत्येक प्रकार के 'टीआई'' –

+0

@ टोगोग्ना चौधरी निश्चित रूप से, वे विधियां हैं। स्केल का उपयोग बहुत अधिक है विधियों के माध्यम से खेतों, जब तक उन्हें 'निजी [यह] ' –

+0

ओप्स के रूप में घोषित नहीं किया जाता है। आप बिल्कुल सही हैं। पारदर्शी गुण जावा में स्पष्ट एक्सेसर्स/म्यूटेटर के लिए उपयोग किए जाने वाले लोगों को भ्रमित करते हैं, जैसे: पी। मुझे फिर से याद दिलाने के लिए धन्यवाद , हालांकि... –

1

घुंघराले ब्रैकेट एक अज्ञात फ़ंक्शन को इंगित करते हैं जिसमें Tuple2[Double,Double] => Double टाइप किया गया है। तर्क स्थानीय नाम t दिया गया है, इसलिए t दो युगल का एक गुच्छा है। t._1 दूसरे आइटम और t._2 दूसरे को संदर्भित करता है।

इसलिए map दो वैक्टरों के घटकों के तत्व-आधारित उत्पादों की एक सूची उत्पन्न करता है, और reduceLeft इन उत्पादों को डॉट उत्पाद की गणना करने के लिए प्रस्तुत करता है।

+0

इस मामले में उपर्युक्त और इस सूची (1,2,3) .map (x => x + 1) ' – Nabegh

+0

@Nabegh के बीच क्या अंतर है, इसमें कोई अंतर नहीं है। –

12

इस विशेष मामले कर्ली कोष्ठक में सादे पुराने वाक्य रचना पर कोई लाभ नहीं है, लेकिन सामान्य रूप में घुंघराले कोष्ठक का उपयोग कर के बारे में मिठाई बात यह है कि वे तुम्हें map ... अंदर पैटर्न मिलान भाव लिखने की अनुमति है:

तो मैं इस पुनर्लेखन कर सकते हैं

.map{ t:(Double, Double) => t._1 * t._2 } 
इस

.map{ case(a: Double, b: Double) => a*b } 

में

लेकिन इस संकलन नहीं होगा:

.map(case(a: Double, b: Double) => a*b) 

._1, ._2 पहले, दूसरे, ... एन-टुपल के एन तत्व तक पहुंच प्रदान करता है, जैसा कि ली ने कहा था।

+0

और ब्रेसिज़ के भीतर आपके पास एक से अधिक पैरामीटर नहीं हो सकते हैं। –

5

आप इस सवाल में ब्रेसिज़ {} और कोष्ठक() के बीच मतभेद को एक बहुत अच्छा जवाब पा सकते हैं: What is the formal difference in Scala between braces and parentheses, and when should they be used?

_1 के लिए, _2, Meaning of _2 sign in scala language देखते हैं।

और हाँ, t:(Double, Double) => t._1 * t._2 एक अज्ञात फ़ंक्शन है (वास्तव में कोई विधि नहीं)। Difference between method and function in Scala

+1

एर, 't' एक पैरामीटर है, अज्ञात फ़ंक्शन नहीं। –

+0

@ डैनियल सी। सोब्राल हां, ज़ाहिर है कि आप सही हैं, मेरा मतलब है कि पूरा निर्माण एक अज्ञात कार्य है। –

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