2012-12-12 48 views
8

मैं आज जेसन हिकी की ऑनलाइन पुस्तक "ऑब्जेक्टिव कैमल का परिचय" पढ़ रहा था और फ़ंक्चरर्स (पृष्ठ 140) के अध्याय में मैं सेट फ़ैक्टर के अंदर निम्न पंक्ति में भाग गया था परिभाषा:ओकैमल में, सूची कन्स्ट्रक्टर :: ऑपरेटर नहीं है

let add = (::) 

कोड चलाने से परिणामस्वरूप बहुत ही रोशनी 'सिंटेक्स त्रुटि' त्रुटि संदेश नहीं हुआ। ओकंपल टोपवेल में लाइन में प्लगइन के बाद मुझे पता चला कि :: वास्तव में एक ऑपरेटर नहीं बल्कि एक प्रकार का कन्स्ट्रक्टर है।

हालांकि, मुझे पता है कि हास्केल के बराबर : कन्स्ट्रक्टर को ऑपरेटर (फ़ंक्शन) के रूप में भी माना जा सकता है।

Prelude> :t (:) 
(:) :: a -> [a] -> [a] 

मेरा प्रश्न है: OCaml कंस्ट्रक्टर्स कभी नहीं प्रथम श्रेणी मूल्यों (जिसका अर्थ है किताब से कोड शुरू से ही गलत था) और कर दिया गया है क्यों यह मामला है?

+0

मैं सामान्य रूप से इस मुद्दे को दूर करने के लिए '(मजेदार x y -> x :: y) 'का उपयोग करता हूं (ऑपरेटर को लैम्ब्डा में परिवर्तित करता है)। यह थोड़ा परेशान है लेकिन काम करता है। साथ ही, यदि '::' कोई फ़ंक्शन था, तब भी आपको वही करना होगा जब भी आपको '::' स्वैप के लिए तर्क की आवश्यकता हो, तो मुझे लगता है कि यह उस सम्मान में कुछ समझ में आता है। –

उत्तर

10

कैमल लाइट, ओकैमल के पूर्ववर्ती में, यह ऐसा मामला होता था जहां रचनाकारों ने आंशिक रूप से लागू होने पर कार्यों को बढ़ावा दिया था। मुझे बिल्कुल यकीन नहीं है कि ओकैमल में जाने पर यह सुविधा क्यों हटा दी गई थी, और मैं इसे भी शोक करता हूं, लेकिन मैंने जो स्पष्टीकरण सुना वह "कोई भी इसका इस्तेमाल नहीं करता था"। तो कोई List.map Some foo अब ...

:: एक बीजीय डेटाप्रकार निर्माता के रूप में थोड़ा विशेष के रूप में यह केवल इन्फ़िक्स निर्माता (पार्सर में hardcoded) है, लेकिन अन्यथा किसी अन्य डेटाप्रकार निर्माता की तरह बर्ताव करता है।

+0

मुझे सुनवाई याद नहीं है "कोई भी इसका इस्तेमाल नहीं किया" स्पष्टीकरण। मुझे लगता है कि प्रेरणा कार्यों और रचनाकारों के बीच अंतर को कम करना था ... – lukstafi

+1

यह सुनना दिलचस्प है। मैं कैमल लाइट का उपयोग करके "प्रोग्रामिंग के लिए कार्यात्मक दृष्टिकोण" को समवर्ती रूप से पढ़ रहा हूं और कई ocassions पर ओकैमल की तुलना में भाषा अच्छी है (मज़ेदार परिभाषा के लिए डिफ़ॉल्ट पैटर्न मिलान, चलो-इन-जहां फॉर्म और इनबिल्ट फ़ंक्शन कंपोज़िशन ऑपरेटर)। – PetarMarendic

+3

जेवियर ने 10 साल पहले उत्तर दिया: http://caml.inria.fr/pub/ml-archives/caml-list/2001/08/47db53a4b42529708647c9e81183598b.fr.html – camlspotter