2010-08-03 15 views
6

मैं बस एफ # पर शुरू कर रहा हूं, और जब ऑपरेटर अधिभार के साथ खेल रहा हूं, तो मैंने कुछ ऐसा किया है जो मुझे समझ में नहीं आता है। अब, मैं समझता हूं कि आप इसका उपयोग नहीं कर सकते, उदाहरण के लिए, +* ओवरलोडेड उपसर्ग ऑपरेटर के रूप में; यह केवल एक इंफिक्स ऑपरेटर हो सकता है। यहाँ है जहाँ मैं भ्रमित हो, हालांकि:एफ # ऑपरेटर/फंक्शन भ्रम

let (+*) a = a + a * a;; 

अगर मैं इस चलाने के लिए, FSI मुझसे कहता है कि समारोह (+*) एक int->int है। बढ़िया, मैं इसे खोद सकता हूं - यह एक ओवरलोडेड ऑपरेटर नहीं है, केवल (+*) नामक एक सामान्य फ़ंक्शन है। तो, अगर मैं करता हूं:

printf "%d" ((+*) 6) 

मुझे 42 मिलेंगे, जैसा कि मुझे उम्मीद है। हालांकि, अगर मैं कोशिश करता हूं:

printf "%d" (+*) 6 
or 
printf "%d" (+*)6 

यह संकलित नहीं होगा। मैं अभी सही त्रुटि नहीं डाल सकता क्योंकि मेरे पास इस समय एक एफ # कंपाइलर तक पहुंच नहीं है, लेकिन यह क्यों है? यहां बाध्यकारी के साथ क्या चल रहा है?

उत्तर

7

यह इस व्याख्या है:

printf "%d" (+*) 6 
इस तरह

:

printf ("%d") (+*) (6) 

दूसरे शब्दों में, printf करने के लिए तीन curried तर्क गुजर, दूसरा जो के समारोह +* लिए एक संदर्भ है।

+0

आह, यह कुछ समझ में आता है। हालांकि, पैरामीटर के लिए रिक्ति सिंटैक्स ऐसा लगता है जैसे यह बाध्यकारी उलझन में हो सकता है। बाइंड पैरामीटर को रिक्त करने के लिए किस क्रम में? मैं पैरामीटर के लिए मजबूर कोष्ठक के साथ सी-जैसी भाषाओं में उपयोग किया जाता हूं, ताकि बाध्यकारी मेरे लिए स्पष्ट हो। – Perrako

+0

पेराको, यह एक महान अनुवर्ती प्रश्न है। इसे एक अलग प्रश्न के रूप में पोस्ट करें ताकि हमारे पास भविष्य के लिए एक संदर्भ होगा (यानी "जब मैं सी-पैरामीटर पैरामीटर के लिए उपयोग किया जाता है तो सिंटैक्स पास करने के लिए एफ # पैरामीटर का उपयोग कैसे किया जाए?")। (मुझे खेद है कि मैं खुद का जवाब नहीं दे सकता; मैंने एफ # से पहले लिस्प को सीखा। इसलिए मुझे अंतरिक्ष सिंटैक्स में इस तरह इस्तेमाल किया गया।) –

+0

कोई बात नहीं, मुझे यह मौजूदा प्रश्न मिला जो शायद आपके उत्तर देगा: http: // stackoverflow .com/प्रश्न/2725202/एफ-फ़ंक्शन-कॉलिंग-सिंटैक्स-भ्रम –