तो मैंने अपने पहले एफ # प्रोग्राम को पूरा करने के बारे में बताया है, मेरी केवल कार्यात्मक पृष्ठभूमि हैस्केल के ज्ञान के थोड़ा (पढ़ें: इसमें वास्तव में कोई प्रोग्राम नहीं बनाया है)।एफ #: मुझे कोई तर्क लेने वाले कार्यों के लिए स्पष्ट रूप से 'इकाई' निर्दिष्ट क्यों करना है?
prepareDeck = allSuits |> List.collect generateCards |> shuffle
और
prepareDeck() = allSuits |> List.collect generateCards |> shuffle
मैंने देखा है कि यह "कैश" पूर्व, यह कभी नहीं recalculating यदि:
कुछ boggling व्यवहार का सामना कर के बाद, मैं एहसास है कि एफ # जो भेदभाव करता है आया इसे दोबारा कहा जाता है, जबकि यह बाद वाले को सामान्य कार्य की तरह व्यवहार करता है। यदि आप प्रश्न में कार्य के साइड इफेक्ट्स नहीं हैं, तो आप अंतर नहीं बता सकते हैं, लेकिन मेरे shuffle
ने किया!
क्या यह सामान्य ज्ञान होना चाहिए था? मैंने अभी तक किसी भी ट्यूटोरियल सामग्री पर इसका उल्लेख नहीं देखा है। क्या पार्सर में सिर्फ एक कमजोरी है, थोड़ी सी तरह से आप में का उपयोग करने से पहले एक फ़ंक्शन घोषित करने के लिए है?
अच्छा उदाहरण। रुचि रखने वाले किसी भी व्यक्ति के लिए, "विशेषज्ञ एफ #" पुस्तक (अध्याय 8) कुशल आंशिक अनुप्रयोग के लिए कार्यों को डिजाइन करने के संदर्भ में इस चर्चा को थोड़ा आगे बढ़ाती है। – itowlson
मुझे लगता है कि यहां कोई दोष है: स्थिर संपत्ति के बीच कोई अंतर नहीं है और उसमें एक स्थिर विधि ** दोनों दृश्यों के पीछे ** विधियां हैं, और एक संपत्ति तक पहुंच वास्तव में एक विधि कॉल है (यही कारण है कि आप चिह्नित कर सकते हैं * वर्चुअल * के रूप में एक संपत्ति)। मैं आपकी "वांछनीय संपत्ति" नहीं देख सकता। –
मेरा मानना है कि अंतर यह है कि जब आपने 'julietNoFunction = ...' स्थिर संपत्ति को स्थिर क्षेत्र पर संग्रहीत एक मूल्य वापस कर दिया है, और यह मान केवल जेनरेट किए गए प्रकार के स्थिर निर्माता पर गणना की जाती है मॉड्यूल। मुझे लगता है कि मैंने इसे परावर्तक में देखा है, लेकिन अब मुझे यकीन नहीं है। वैसे भी, जिस तरह से आप इसे पेश करते हैं, वह 'जूलियट = ...' पर 'जूलियट() = ...' का उपयोग करने पर किसी भी फायदे को प्रदर्शित नहीं करता है। –