字符串到char列表

时间:2012-04-09 03:53:27

标签: ocaml

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

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

6 个答案:

答案 0 :(得分:28)

除此之外,但非常重要:

你的代码显然是错误的,因为你有一个递归调用,所有的参数都与你完全相同。它将引入一个具有相同值的无限调用序列,从而永远循环(一个堆栈)在尾部调整位置不会发生溢出。)


执行您想要的代码:

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

答案 1 :(得分:7)

尝试一下:

let explode s = List.init (String.length s) (String.get s)

答案 2 :(得分:5)

简单明了:

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

答案 3 :(得分: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;;

答案 4 :(得分:0)

这是一个迭代版本,可从字符串获取字符列表:

let string_to_list s = 
let l = ref [] in
for i = 0 to String.length s - 1 do
    l := (!l) @ [s.[i]]
done;
!l;;

答案 5 :(得分:0)

我的代码,适用于现代OCaml:

let charlist_of_string s =
  let rec trav l i =
    if i = l then [] else s.[i]::trav l (i+1)
  in
  trav (String.length s) 0;;

let rec string_of_charlist l =
  match l with
    [] -> "" |
    h::t -> String.make 1 h ^ string_of_charlist t;;