2012-04-09 17 views
14

Quiero escribir una función que tomando una cadena y devolver una lista de caracteres. Aquí hay una función, pero creo que no es hacer lo que quiero (quiero tomar una cadena y devolver una lista de caracteres).cadena a la lista de caracteres

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

En el lado positivo, esto funcionará para una cadena vacía! Necesita manejar cadenas no vacías un poco mejor. Como OCaml no permite desestructurar una cadena con coincidencia de patrones, una función como esta probablemente usará un índice (un entero) para obtener los caracteres en la cadena. –

+2

'| n -> string_to_char_list n' eso es un ciclo infinito para ti. ¡Nunca recurse con el mismo parámetro en el que ingresó! – Ptival

Respuesta

25

Aparte, pero muy importante:

su código es obviamente erróneo porque tiene una llamada recursiva para el que todos los parámetros son los mismos exacto que tienes en Se va a inducir una secuencia infinita. de llamadas con los mismos valores en, por lo tanto, bucle siempre (un desbordamiento de la pila no ocurrirá en la posición tail-rec).


El código que hace lo que quiere serían:

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) [] 

Fuente: http://caml.inria.fr/pub/old_caml_site/FAQ/FAQ_EXPERT-eng.html#strings


Alternativamente, se puede optar por utilizar una biblioteca: baterías String.to_list o extlib String.explode

5

Ni ce y simple:

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

¿Qué tal algo como esto:

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;; 
Cuestiones relacionadas