2012-03-20 11 views
7

मैं ओकैम के लिए नया हूं, बस यह सुनिश्चित करना चाहता हूं कि एक सरल कार्य कैसे करें, जैसे रिकर्सिव फ़ंक्शन का उपयोग करके सूची के एनएच तत्व को वापस कर दें? int list * int -> intओकैमल में एक सूची का nth तत्व वापस करें?

उदाहरण get_nth ([1,2,3], 1) -> 2 के लिए

साथ

प्रोटोटाइप get_nth (list, n) की तरह आप

+1

यह वास्तव में होमवर्क समस्या की तरह लगता है। इससे मदद मिलेगी यदि आपने कुछ कोड दिखाया है जो आपने कोशिश की है जो आपको उम्मीद के अनुसार काम नहीं करता है। –

उत्तर

11

आपको नोटिस नहीं हो सकता है लेकिन List.nth फ़ंक्शन पहले से ही List module में है।

आप प्रत्यावर्तन का उपयोग कर इसे लिखने के लिए करना चाहते हैं:

let rec get_nth = function 
    | [], _ -> raise (Failure "get_nth") 
    | _, n when n < 0 -> raise (Invalid_argument "get_nth") 
    | x::_, 0 -> x 
    | x::xs, n -> get_nth(xs, n-1) 
+0

@VictorNicollet: संपादन के लिए धन्यवाद। – pad

4

tuples का उपयोग के रूप में इस तरह मापदंडों OCaml में आम नहीं है धन्यवाद। आम तौर पर आप currying का उपयोग करें और इस तरह से अपने कार्य निर्धारित करना होगा:

let get_nth list n = ... 

यह हस्ताक्षर 'a list -> int -> 'a होगा। यह भी ध्यान रखें कि आपके पास 'a पैरामीटर है, जिसका अर्थ है कि, आपके फ़ंक्शन को अकेले इनट्स पर सीमित करने का कोई वास्तविक कारण नहीं है।

अब समस्या को देखें। यदि आप ज़ीरोथ तत्व प्राप्त करना चाहते हैं, तो आपका फ़ंक्शन कैसा दिखता है?

let get_nth list 0 = List.head list (* this is not actually valid in OCaml *) 

अब अगर आप एक (नायब n> मी) मीटर आइटम की सूची से n वें तत्व प्राप्त करने के लिए एक समारोह है, आप कैसे है कि समारोह इस्तेमाल कर सकते हैं एक और समारोह जो n + एक से 1 तत्व है मिल के निर्माण के लिए एम + 1 तत्वों की सूची? n + 1 तत्वों के लिए कि समारोह get_nth'

let get_nth' list n' = get_nth (List.tail list) (n'-1) 

अब तुम सब करने की जरूरत है दो गठबंधन करने के लिए है और आपका काम हो गया हो। मैं उस अंतिम भाग को आपके पास छोड़ दूंगा।

यदि आप इस सलाह का पालन करते हैं तो आपको ऐसा कुछ मिलता है जो उससे अधिक जटिल है। हालांकि यह समझना आसान है कि इस तरह क्या हो रहा है।

+0

दुर्भाग्यवश, मुझे डर है कि आपका प्रयास होने की अपेक्षा अधिक भ्रमित है। ओकंपल पैटर्न मिलान अपने आप पर काफी दृष्टि से व्याख्यात्मक है। – PieOhPah

3

(मेरी राय में) एक टपल का उपयोग कर किया जा सकता है बिना एक सरल समाधान:

let rec get_nth mylist index = match mylist with 
    | [] -> raise (Failure "empty list") 
    | first::rest -> 
     if index = 0 then first 
     else get_nth rest (index-1) 
;; 
+1

मैं इसे सही उत्तर बना देता। Ocaml फ़ंक्शन में तर्क के रूप में टुपल का उपयोग करना बहुत मूर्ख नहीं है और आवंटन की आवश्यकता है। – PieOhPah

0

मैं पढ़ा है hereResult का उपयोग कर कि त्रुटि बढ़ाने के बजाए आपको try ... with का उपयोग करने की आवश्यकता नहीं है क्योंकि त्रुटि उत्पन्न हो सकती है। अगर मैं सही हूँ (कोड @Omar Mahili से संपादित)

let rec get_nth mylist index = match mylist with 
    | [] -> Error "empty list" 
    | first::rest -> 
     if index = 0 then Ok first 
     else get_nth rest (index-1) 
;; 

let result [1; 2; 3] 2 in 
    match result with 
    | Error reason -> print_string reason 
    | Ok num -> print_int num 
;; 

Result, Core.Std का हिस्सा है।

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