2010-05-09 12 views
33

एक कार्यात्मक मानसिकता में सोचते समय, यह देखते हुए कि कार्यों को शुद्ध माना जाता है, कोई भी निष्कर्ष निकाल सकता है जिसमें कोई तर्क मूल रूप से केवल एक मूल्य नहीं है।
हालांकि, रियलिटी रास्ते में आती है, और विभिन्न इनपुट के साथ, मुझे एक निश्चित फ़ंक्शन की आवश्यकता नहीं हो सकती है, और यदि वह फ़ंक्शन कम्प्यूटेशनल रूप से महंगा है, तो इसकी आवश्यकता होने पर मैं इसका मूल्यांकन नहीं करना चाहूंगा।
मुझे let func _ = ... का उपयोग करके एक कार्यवाही मिली और इसे func 1 या जो कुछ भी कहा जाता है, लेकिन यह पाठक को बहुत गैर-मूर्ख और भ्रमित लगता है।एफ # - कोई तर्क के साथ समारोह?

यह एक प्रश्न पर उबाल जाता है: एफ # में, क्या शून्य तर्क के साथ एक समारोह घोषित करने का कोई उचित तरीका है, इसे घोषणा पर मूल्यांकन किए बिना?

+0

कोई भी इस दृष्टिकोण को ले सकता है कि मूल्य "मूल रूप से कोई तर्क नहीं है," इस प्रकार हैस्केल चीजों को कैसे देखता है। मुझे आश्चर्य है कि एफ # इस संबंध में क्यों अलग है। – jpaugh

+0

@self ऐसा इसलिए है क्योंकि हास्केल भी डिफ़ॉल्ट रूप से आलसी है; फ़ंक्शंस समेत कोई मूल्य, घोषणा पर मूल्यांकन नहीं किया जाता है जब तक कि प्रोग्रामर स्पष्ट रूप से इसके लिए नहीं पूछता। एफ # में अर्थशास्त्र डिफ़ॉल्ट रूप से सख्त हैं, और अलग-अलग प्रतिनिधित्व किया जाना चाहिए। – jpaugh

उत्तर

47

सामान्य मुहावरे फ़ंक्शन को एक इकाई (let functionName() = 42) के एक तर्क लेने के लिए परिभाषित करना है। इसके बाद इसे functionName() कहा जाएगा। (इकाई प्रकार में केवल एक मान है, जो () है।)

+0

हम्म लेकिन आप इस वाक्यविन्यास के साथ एक रिकॉर्ड प्रकार प्रारंभ नहीं कर सकते हैं (उदाहरण के लिए गेटटर = {नाम: स्ट्रिंग; फ़ंक्शन:() -> स्ट्रिंग;} की अनुमति नहीं है)। किसी भी विचार को इस बारे में कैसे जाना है? – evolvedmicrobe

+0

@evolvedmicrobe '()' के प्रकार को 'यूनिट' कहा जाता है। प्रतिक्रिया के लिए – sepp2k

+0

धन्यवाद, लेकिन यह संकलित नहीं करता है। क्या इस तरह एक रिकॉर्ड प्रकार लिखना संभव है? – evolvedmicrobe

12

मुझे लगता है कि आप क्या चाहते हैं lazy है।

let resource = 
    lazy(
     // expensive value init here 
    ) 

फिर बाद में जब आप मूल्य पढ़ने की जरूरत है ...

resource.Value 

तुम कभी नहीं मान संपत्ति कॉल करते हैं, lazy ब्लॉक के अंदर कोड कभी नहीं चलाने हो जाता है, लेकिन यह फोन करता है, तो आप ऐसा करेंगे , वह कोड एक से अधिक बार नहीं चलाया जाएगा।

+1

इस सुझाव की कमी यह है कि 'resource.Value' को कॉल करना हमेशा एक ही मान वापस कर देगा क्योंकि इसे केवल एक बार निष्पादित किया जाता है, जबकि "पैरामीटर रहित" फ़ंक्शन का रिटर्न मान प्रत्येक कॉल पर भिन्न हो सकता है। – Oliver

+0

सही, लेकिन यदि कार्य कार्यात्मक शर्तों में शुद्ध है और इसमें कोई तर्क नहीं है, तो यह हमेशा वही मान वापस करेगा। –

+0

मैं दो कार्यों के बारे में सोच सकता हूं जो हमेशा एक अलग मूल्य लौटाते हैं: एक यादृच्छिक संख्या जेनरेटर और वर्तमान दिनांक/समय प्रदाता। मुझे नहीं पता कि _purity_ _functional terms_ में क्या मतलब है, लेकिन वे वैध उदाहरण हैं जहां आपका आलसी मूल्य दृष्टिकोण काम नहीं करेगा। – Oliver

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