2012-04-09 82 views
14

我想写一个函数,它接受一个字符串并返回一个char列表。这是一个函数,但我认为这不是我想做的(我想要一个字符串并返回一个字符列表)。字符串到字符列表

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

从有利的一面,这会为空字符串工作!您需要更好地处理非空字符串。由于OCaml不允许使用模式匹配来解构字符串,因此像这样的函数可能会使用索引(整数)来获取字符串中的字符。 – 2012-04-09 03:58:44

+2

'| n - > string_to_char_list n'这是一个无限循环。永远不要用你得到的相同参数递归! – Ptival 2012-04-09 06:49:42

回答

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

Ni 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;; 
相关问题