2013-04-20 7 views
5

OCaml 3.12.1 में, List.map लिखा है:ओकैम की सूची.मैप में क्यों चल रहा है? इस प्रकार

let rec map f = function 
    [] -> [] 
    | a::l -> let r = f a in r :: map f l 

मैं उम्मीद थी कि अंतिम पंक्ति | a::l -> f a :: map f l के रूप में लिखा, लेकिन इसके बजाय, वहाँ एक उचित रूप में बेकार let बाध्यकारी है। क्यूं कर?

उत्तर

9

मुझे विश्वास है कि यह मानचित्र के लिए फ़ंक्शन एप्लिकेशन के आदेश की गारंटी देने के लिए है। ओकैमल में सरल अभिव्यक्तियों के मूल्यांकन का आदेश अनिर्दिष्ट है, इसलिए let के बिना सूची के तत्वों के लिए f के अनुप्रयोगों का क्रम निर्दिष्ट नहीं किया जाएगा। चूंकि ओकैमल एक शुद्ध भाषा नहीं है, इसलिए आप वास्तव में आदेश निर्दिष्ट करना चाहते हैं (f को पहले सूची के शीर्ष पर बुलाया जाता है, और फिर रिकर्सिव पर)।

+1

दरअसल, ओकैम I के प्रत्येक संस्करण (4.00.1 तक) ने निम्न व्यवहार दिखाया: 'मैप' को परिभाषित करें 'रिक री मैप करें f = function [] -> [] | x :: xs -> f x :: map f xs ;; 'और फिर' map print_string ["a" को कॉल करें; "बी"; "सी"] ;; '। यह सूची-तत्वों को दाएं से बाएं से प्रिंट करता है। – chris

+0

List.map में ऑर्डर निर्दिष्ट करने की आवश्यकता क्यों है? मुझे लगता है कि पहले से या बाद में 'एफ ए' का मूल्यांकन किया जा रहा है, है ना? –

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