Ocaml 字符串到字符列表

Ocaml 字符串到字符列表,ocaml,Ocaml,我想写一个函数,它接受一个字符串并返回一个字符列表。这是一个函数,但我认为它不是我想要的(我想要获取一个字符串并返回一个字符列表) 除此之外,非常重要的是: 您的代码显然是错误的,因为您有一个递归调用,其中所有参数都与您在其中得到的参数完全相同。它将在中引发具有相同值的无限多个调用序列,从而永远循环(不会在tail rec位置发生堆栈溢出) 执行您想要的操作的代码是: let explode s = let rec exp i l = if i < 0 then l else

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


除此之外,非常重要的是:

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


执行您想要的操作的代码是:

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) []
让我们爆炸吧=
让我们来看看=
如果i<0,那么l else exp(i-1)(s[i]::l)in
exp(String.length s-1)[]
资料来源:


或者,您可以选择使用库:电池或extlib

let rec list_car ch = match ch with
    | "" -> []
    | ch -> (String.get ch 0 ) :: (list_car (String.sub ch 1 ( (String.length ch)-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;;
试试这个:

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

下面是从字符串获取字符列表的迭代版本:

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

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

让字符串的字符列表\u=
让我来记录一下=
如果i=l,则[]其他s.[i]::trav l(i+1)
在里面
trav(String.length s)0;;
let rec string_of_charlist l=
匹配
[] -> "" |
h::t->String.make 1h^String\u of_charlist t;;

从好的方面来说,这将适用于空字符串!您需要更好地处理非空字符串。由于OCaml不允许您使用模式匹配来解构字符串,类似这样的函数可能会使用索引(整数)来获取字符串中的字符。
\n->string\u to\u char\u list n
这是一个无限循环。永远不要使用您输入的相同参数递归!注意:在OCaml 4.06.0中添加了List.init。
let string_to_list s = 
let l = ref [] in
for i = 0 to String.length s - 1 do
    l := (!l) @ [s.[i]]
done;
!l;;