2010-11-30 13 views
6

हो सकता है कि मैं ओकंपल में एक प्रोग्राम लिख रहा हूं जिसमें कुछ लूप "के लिए" हैं, मेरी समस्या यह है कि इन चक्रों में से प्रत्येक के लिए आपको यह संदेश प्राप्त होता है: "चेतावनी 10: इस अभिव्यक्ति के प्रकार होना चाहिए इकाई। "चेतावनी 10: इस अभिव्यक्ति में टाइप यूनिट

उदाहरण:

let f q p rho= 

     let x = [] in 
     if q > p then 
      for i=0 to rho do 
       x= q :: x 
      done;  
    x;; 

इस हर बार जब मैं एक साइकिल का उपयोग" के लिए ", मैं कैसे इस समस्या को हल कर सकते हैं?

उत्तर

8

आपके कोड के साथ कई समस्याएं हैं।

त्रुटि यह है क्योंकि for कुछ भी वापस नहीं करता है, और इसलिए लूप के अंदर पूरी तरह से दुष्प्रभाव के लिए होना चाहिए। तो यह इकाई प्रकार होना चाहिए। = के आपके उपयोग में यूनिट प्रकार नहीं है, क्योंकि = वास्तव में समानता ऑपरेटर है, दो मानों की तुलना करता है, और true या false लौटा रहा है।

तो आप गलत ऑपरेटर का उपयोग कर रहे हैं। ऐसा लगता है कि आप x पर "असाइन" करने का प्रयास कर रहे हैं। लेकिन एमएल में, आप "चर" को असाइन नहीं कर सकते हैं, क्योंकि जब वे परिभाषित होते हैं और बदल नहीं सकते हैं तो वे एक मान से बंधे होते हैं। उत्परिवर्तन प्राप्त करने का एक तरीका है, एक म्यूटेबल सेल (जिसे "संदर्भ" कहा जाता है) का उपयोग करना है: आप ref फ़ंक्शन का उपयोग प्रारंभिक मान से म्यूटेबल सेल बनाने के लिए करते हैं; ! ऑपरेटर इसके मूल्य को प्राप्त करने के लिए; और := ऑपरेटर अंदर मूल्य बदलने के लिए।

उदाहरण के लिए

तो:

let f q p rho= 

    let x = ref [] in 
    if q > p then 
     for i=0 to rho do 
      x := q :: !x 
     done;  
    !x;; 
+0

के लिए धन्यवाद अपने जवाब, अपना उदाहरण बढ़ाओ "!" : x: = q ::! x – kafka

+0

@ एंटोनियो: धन्यवाद – newacct

3

पाश इस प्रकार का शायद सबसे अच्छा प्रत्यावर्तन का उपयोग कर व्यक्त किया जाता है:

let f q p rho= 
    let rec loop i = 
    if i > rho then 
     [] 
    else 
     q::(loop (i+1)) 
    in 
    if q > p then 
     loop 0 
    else 
     [];; 

या क्या हम कर सकते हैं यह पूंछ पुनरावर्ती:

let f q p rho= 
    let rec loop i acc = 
    if i > rho then 
     acc 
    else 
     loop (i+1) (q::acc) 
    in 
    if q > p then 
     loop 0 [] 
    else 
     [];; 
संबंधित मुद्दे