char

2012-04-09 15 views
14

की सूची में स्ट्रिंग मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो स्ट्रिंग ले और चार की सूची लौटाए। यहां एक फ़ंक्शन है, लेकिन मुझे लगता है कि यह वही नहीं है जो मैं चाहता हूं (मैं एक स्ट्रिंग लेना चाहता हूं और पात्रों की एक सूची वापस करना चाहता हूं)।char

let rec string_to_char_list s = 
    match s with 
     | "" -> [] 
     | n -> string_to_char_list n 
+0

प्लस तरफ, यह एक खाली स्ट्रिंग के लिए काम करेंगे! आपको गैर-खाली तारों को थोड़ा बेहतर तरीके से संभालने की आवश्यकता है। चूंकि ओकैमल आपको पैटर्न मिलान के साथ एक स्ट्रिंग को नष्ट नहीं करने देता है, इसलिए इस तरह का एक फ़ंक्शन स्ट्रिंग में वर्णों को प्राप्त करने के लिए शायद एक अनुक्रमणिका (एक पूर्णांक) का उपयोग करने जा रहा है। –

+2

'| n -> string_to_char_list n' जो आपके लिए एक अनंत लूप है। आपके द्वारा प्राप्त किए गए उसी पैरामीटर के साथ कभी भी पुन: साझा न करें! – Ptival

उत्तर

25

एक तरफ है, लेकिन बहुत महत्वपूर्ण: क्योंकि तुम एक पुनरावर्ती कॉल जिसके लिए सभी मापदंडों में ठीक उसी एक आप में मिल गया हैं

आपका कोड स्पष्ट रूप से गलत है यह एक अनंत अनुक्रम प्रेरित करने के लिए जा रहा है। एक ही मूल्य के साथ कॉल के लिए, इस प्रकार हमेशा के लिए लूपिंग (एक ढेर ओवरफ्लो पूंछ-आरईसी स्थिति में नहीं होगा)।


कोड करता है कि आप क्या होगा चाहते हैं:

let explode s = 
    let rec exp i l = 
    if i < 0 then l else exp (i - 1) (s.[i] :: l) in 
    exp (String.length s - 1) [] 

स्रोत: http://caml.inria.fr/pub/old_caml_site/FAQ/FAQ_EXPERT-eng.html#strings


वैकल्पिक रूप से, आप एक पुस्तकालय का उपयोग करने के लिए चुन सकते हैं: बैटरी String.to_list या extlib String.explode

5

नी ce और सरल:

let rec list_car ch = match ch with 
    | "" -> [] 
    | ch -> (String.get ch 0) :: (list_car (String.sub ch 1 ((String.length ch)-1))) ;; 
1

कैसे कुछ इस तरह के बारे में:

let string_to_list str = 
    let rec loop i limit = 
    if i = limit then [] 
    else (String.get str i) :: (loop (i + 1) limit) 
    in 
    loop 0 (String.length str);; 

let list_to_string s = 
    let rec loop s n = 
    match s with 
     [] -> String.make n '?' 
    | car :: cdr -> 
     let result = loop cdr (n + 1) in 
     String.set result n car; 
     result 
    in 
    loop s 0;; 
संबंधित मुद्दे