2012-10-15 11 views
10

किसी को भी व्याख्या कर सकते हैं जब मैं foldLeft समारोह लागू करने के लिए डॉट नोटेशन छोड़ कारण है कि मैं निम्नलिखित के लिए इस संकलन त्रुटि देखते हैं? (संस्करण 2.9.2)क्यों डॉट आउट को फोल्ड में छोड़ना एक संकलन त्रुटि का कारण बनता है?

scala> val l = List(1, 2, 3) 
res19: List[Int] = List(1 ,2 ,3) 

scala> l foldLeft(1)(_ * _) 
<console>:9: error: Int(1) does not take parameters 
        l foldLeft(1)(_ * _) 
            ^

लेकिन

scala> l.foldLeft(1)(_ * _) 
res27: Int = 6 

यह नहीं करता है ' map जैसे अन्य उच्च ऑर्डर फ़ंक्शंस के लिए सही नहीं है, जो मुझे लगता है कि मैं डॉट की आपूर्ति करता हूं या नहीं।

मैं अपने एक संबद्धता बात नहीं लगता क्योंकि मैं सिर्फ आह्वान नहीं कर सकते foldLeft(1)

उत्तर

17

क्योंकि foldLeft curried है यह है। साथ ही डॉट नोटेशन का उपयोग कर के रूप में, आप भी इस जोड़ने कोष्ठकों द्वारा ठीक कर सकते हैं:

scala> (l foldLeft 1)(_ * _) 
res3: Int = 6 

ओह - और foldLeft(l) आह्वान करने के लिए सक्षम नहीं होने के बारे में अपनी टिप्पणी के बारे में, आप कर सकते हैं, लेकिन आप आंशिक रूप से इसे इस तरह लागू करने की आवश्यकता :

scala> (l foldLeft 1) _ 
res3: ((Int, Int) => Int) => Int = <function1> 
+0

धन्यवाद रचनात्मक नोट, मेरे प्रश्न का पूरा उत्तर रेगिस्तान के पोस्ट पर किए गए पहले टिप्पणी में रहता है कि पार्सर अभिव्यक्ति पर हमला कैसे करता है। – nsfyn55

3

डॉट को छोड़ने का जो उम्मीद इन्फ़िक्स संकेतन के लिए स्केला का वाक्यात्मक समर्थन, की वजह से संभव है 3 भागों:

leftOperand operator rightOperand. 

लेकिन क्योंकि foldLeft मापदंडों के दो सूची था, तो आप वाक्यात्मक स्तर पर 4 भागों के साथ अंत: lfoldLeft(1)(_ * _)

कौन सा इन्फ़िक्स संकेतन, इसलिए त्रुटि मेल नहीं खाती।

+0

इंफिक्स नोटेशन उपयोगी होने पर यह समझने के लिए अंगूठे का एक अच्छा नियम हो सकता है, लेकिन मुझे यकीन नहीं है कि यह पूरी तरह सटीक है। इन्फिक्स नोटेशन का उपयोग करके 'foldLeft' को कॉल करना संभव है (जैसा कि मेरे पिछले उत्तर में दिखाया गया है)। समस्या यह है कि पार्सर 'l fold left (1) (_ * _)' 'l foldLeft ((1) (_ * _))' 'l foldLeft (1)) के बजाय' l fold left (1) (_ * _) 'को पार्स कर रहा है (_ * _) '। –

+0

वैसे आपका काम वास्तव में मेरे बिंदु को साबित करता है। आप फ़ोल्डलिफ्ट के आंशिक अनुप्रयोग को मजबूर कर रहे हैं ताकि 3 भाग हों, जो इन्फिक्स नोटेशन को संभव बनाता है। परिणाम एक समारोह है, जिसे आप तुरंत कॉल करते हैं। –

+0

क्षमा करें - यह मेरे हिस्से पर सिर्फ पैडेंट्री है, लेकिन त्रुटि इंफिक्स नोटेशन को संकलक द्वारा अस्वीकार करने के कारण नहीं है। यह '(_ * _) 'से' (1) 'लागू करने की कोशिश कर रहे संकलक के कारण है, जो यह नहीं कर सकता है। –

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