हैलो दोस्तों मैं एक सरल पुनरावर्ती विधि बनाने की कोशिश कर रहा हूं जो बस एक संचायक और एक लक्ष्य मान लेता है। फिर संचायक में एक जोड़ें जब तक कि यह लक्ष्य मूल्य तक न पहुंच जाए। मैं ओकैम के लिए बहुत नया हूं लेकिन जावा में एक अच्छी पृष्ठभूमि है।

मैंने कोड का एक त्वरित स्निपेट लिखा है जो दिखाता है कि मैं जावा में क्या करना चाहता हूं:

    public static int rec(int acc,int target) {
        if (acc == target) {
            return 0;
        } else {
            return rec(acc+1, target);
        }
    }

यहाँ Ocaml में इस कोड की नकल करने का मेरा प्रयास है:

  let h_sequence x =
      let rec helper acc x = function
      | acc -> x
      | _ -> helper acc+1 x
      in
      helper 0 x;;

हालांकि मुझे निम्न त्रुटि मिलती है:

Error: This expression has type 'a -> 'b -> 'a
       but an expression was expected of type int

यहां बताया गया है कि मैं Ocaml कोड को कैसे समझने की कोशिश कर रहा हूं। तो हमारे पास एक फ़ंक्शन h_sequence है जिसमें एक पैरामीटर x है। फ़ंक्शन के अंदर h_sequence हमारे पास हेल्पर नामक एक पुनरावर्ती फ़ंक्शन है जिसमें दो पैरामीटर एसीसी और एक्स हैं। अगर एसीसी = एक्स तो एक्स वापस करें। अन्यथा हेल्पर में गुजरकर रिकर्सन शुरू करें, एसीसी में एक जोड़ें और फिर एक्स वापस करें। और इसके बाद इसमें हेल्पर फंक्शन पास कर रहा है, acc के लिए 0 सेट कर रहा है और x को x के रूप में सेट कर रहा है। कृपया मुझे बताएं कि क्या मेरा तर्क बंद है। किसी भी प्रकार के मदद की बहुत सराहना की जाएगी!

नया कोड संपादित करें:

  let h_sequence x =
      let rec helper acc x = 
        if acc = x then
            acc
        else
            helper (acc+1) x
      in
      helper 0 x;;

0
Kyle Lynch 5 मई 2020, 02:40
पुनरावर्ती फ़ंक्शन helper में वास्तव में तीन "पैरामीटर" होते हैं: acc, x, और एक अन्य "पैरामीटर" जिसका function का उपयोग करके मिलान किया जाता है।
 – 
Flux
5 मई 2020, 03:03

2 जवाब

जैसा कि @ फ्लक्स कहता है, आपके सहायक कार्य में 3 पैरामीटर हैं। आपको यह भी पता होना चाहिए कि पैटर्न acc सभी मानों से मेल खाएगा। पैटर्न में अनिवार्य रूप से स्थिरांक होते हैं, और पैटर्न में दिखने वाला कोई भी नाम किसी भी संबंधित मान से मेल खाएगा (और बाध्य होगा)।

x की तुलना acc से करने के लिए आपको केवल if कथन का उपयोग करना चाहिए।

चूंकि आप वास्तव में पैटर्न मिलान का उपयोग नहीं करना चाहते हैं, आप function को हटाकर चीजों को सरल बना सकते हैं। आप सहायक कार्य के लिए कुछ इस तरह से समाप्त करेंगे:

let rec helper acc x =
    if x = acc then (* One of the cases *)
    else (* The other case *)
0
Jeffrey Scofield 5 मई 2020, 03:04
शुक्रिया! यह समझ में आता है कि मैंने अपना कोड संपादित किया है
 – 
Kyle Lynch
5 मई 2020, 03:14

... हमारे पास हेल्पर नाम का एक रिकर्सिव फ़ंक्शन है जिसमें दो पैरामीटर एसीसी और एक्स हैं।

आपको त्रुटि इसलिए मिल रही है क्योंकि पुनरावर्ती फ़ंक्शन helper में वास्तव में तीन "पैरामीटर" हैं: acc, x, और एक अन्य "पैरामीटर" जिसका function का उपयोग करके मिलान किया जाता है। त्रुटि संदेश ने आपको यह सुराग दिया है ('a -> 'b -> 'a)।

आइए अब helper फ़ंक्शन को देखें:

let rec helper acc x = function
    | zzz -> x  (* Equivalent to `| _ -> x` *)
    | _ -> helper acc+1 x

गलतियां:

  1. function पैटर्न मिलान करता है। सब कुछ पैटर्न zzz से मेल खाएगा, जिसका अर्थ है कि अगला पैटर्न (| _ -> helper acc+1 x) बेकार है क्योंकि यह कभी भी मेल नहीं खाएगा। ध्यान दें कि मैंने पैटर्न का नाम आपके acc से बदलकर zzz कर दिया है ताकि इस बात पर जोर दिया जा सके कि function वास्तव में मेल खाने वाले पैटर्न हैं।

  2. helper acc+1 x (helper acc) + 1 x के बराबर है, जो आप नहीं चाहते। इसके बजाय यह helper (acc+1) x होना चाहिए।

समाधान

let rec helper acc x = 
    if acc >= x then 0
    else helper (acc+1) x

जहां x ऋणात्मक है, वहां मामले को संभालने के लिए आपको = के बजाय >= का उपयोग करना चाहिए।

0
Flux 5 मई 2020, 03:34