2010-06-18 16 views
6

मैं ocaml और कोशिश कर के लिए नया हूँ शैली समारोह लेकिन काफी उलझन में क्या मूल्य मैंOCaml निरंतरता गुजर शैली

उदाहरण के लिए, मैं एक पुनरावर्ती समारोह लिख सकते हैं कश्मीर पर अतिरिक्त तर्क में पारित करने की जरूरत गुजर एक निरंतरता लिखने के लिए कि अगर सूची के सभी तत्व भी हैं, अन्यथा झूठी है तो सच हो जाता है।

इसलिए इसकी तरह

let rec even list = .... 
सीपीएस पर

, मैं मैं इतना

let rec evenk list k = .... 

की तरह समारोह पारित करने के लिए एक तर्क जोड़ने की जरूरत है पता है, लेकिन मैं कोई सुराग नहीं कैसे इस कश्मीर से निपटने के लिए और यह वास्तव में कैसे काम करता है

उदाहरण के लिए यह भी कार्य करता है, पर्यावरण

जैसा दिखता है
val evenk : int list -> (bool -> ’a) -> ’a = <fun> 

evenk [4; 2; 12; 5; 6] (fun x -> x) (* output should give false *) 

उत्तर

11

निरंतरता k एक ऐसा फ़ंक्शन है जो परिणाम evenk से परिणाम लेता है और "शेष गणना" करता है और "उत्तर" उत्पन्न करता है। उत्तर का क्या प्रकार है और "गणना के बाकी" द्वारा आपका क्या मतलब है के लिए आप सीपीएस का उपयोग कर रहे हैं। सीपीएस आमतौर पर अपने आप में अंत नहीं होता है लेकिन कुछ उद्देश्य के साथ दिमाग में किया जाता है। उदाहरण के लिए, सीपीएस फॉर्म में नियंत्रण ऑपरेटरों को लागू करना या पूंछ कॉल को अनुकूलित करना बहुत आसान है। यह जानने के बिना कि आप क्या हासिल करने की कोशिश कर रहे हैं, आपके प्रश्न का उत्तर देना मुश्किल है।

इसके लिए क्या योग्य है, यदि आप सीधे सीधी शैली से निरंतरता-गुजरने वाली शैली में परिवर्तित करने की कोशिश कर रहे हैं, और आप जिसकी देखभाल करते हैं, वह जवाब का मूल्य है, पहचान कार्य को पारित करने के रूप में निरंतरता सही है।

एक अच्छा अगला कदम evenk को सीपीएस का उपयोग करके लागू करना होगा। मैं एक सरल उदाहरण करूँगा। अगर मैं प्रत्यक्ष शैली कार्य हो

let muladd x i n = x + i * n 

और अगर मैं सीपीएस पुरातन mulk और addk मान, मैं

let muladdk x i n k = 
    let k' product = addk x product k in 
    mulk i n k' 

लिख सकते हैं और आप देखेंगे कि mulptiplication पहले से किया जाता है, तो यह k' के साथ "जारी है", जो जोड़ता है, और अंत में continuesk के साथ, जो कॉलर पर लौटाता है। मुख्य विचार यह है कि muladdk के शरीर के भीतर मैंने एक नई निरंतरता k' आवंटित की जो मल्टीप्ली-एडे फ़ंक्शन में मध्यवर्ती बिंदु के लिए है। अपना evenk काम करने के लिए आपको कम से कम एक ऐसी निरंतरता आवंटित करनी होगी।

मुझे उम्मीद है कि इससे मदद मिलती है।

5

जब से तुम के आह्वान है evenk सही (पहचान समारोह के साथ - प्रभावी रूप से जारी रखने के-गुजर शैली वापस सामान्य शैली को बदलने), मुझे लगता है कि कठिनाई evenk को परिभाषित करने में है।

k शेष गणना का प्रतिनिधित्व करने वाला निरंतर कार्य है और अंतिम मूल्य का उत्पादन करता है, जैसा कि नॉर्मन ने कहा था।तो, आपको even के परिणाम की गणना करने की आवश्यकता है और k पर परिणाम k v पर वापस v पर वापस कर दें।

7

जब भी मैंने सीपीएस के साथ खेला है, तो जारी रखने की बात केवल वही चीज है जो आप आमतौर पर कॉलर पर वापस आती हैं। इस साधारण मामले में, एक अच्छा "अंतर्ज्ञान स्नेहक" निरंतरता "वापसी" का नाम है।

let rec even list return = 
    if List.length list = 0 
    then return true 
    else if List.hd list mod 2 = 1 
     then return false 
     else even (List.tl list) return;; 

let id = fun x -> x;; 

उदाहरण का उपयोग: "यहां तक ​​कि [2; 4; 6; 8] आईडी ;;"।

1

आप अपने फ़ंक्शन के परिणाम इनपुट के रूप में देना चाहते हैं जैसे कि यह निरंतर उत्तीर्ण शैली के साथ नहीं लिखा गया था।

(* val even_list : int list -> bool *) 
let even_list input = List.for_all (fun x -> x mod 2=0) input 

अब यह एक निरंतरता cont साथ लिख देना:

(* val evenk : int list -> (bool -> 'a) -> 'a *) 
let evenk input cont = 
    let result = even_list input in 
    (cont result) 

आप परिणाम की गणना अपने कार्य, और पास

यहाँ अपने समारोह जो परीक्षण एक सूची केवल भी पूर्णांक हैं या नहीं result निरंतरता के लिए ...