字符串到char列表

Quy*_*yen 18 ocaml

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

let rec string_to_char_list s =
    match s with
      | "" -> []
      | n -> string_to_char_list n
Run Code Online (Sandbox Code Playgroud)

Pti*_*val 29

除此之外,但非常重要:

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


做你想要的代码是:

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) []
Run Code Online (Sandbox Code Playgroud)

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


或者,您可以选择使用库:batteries String.to_list或extlib String.explode


sma*_*c89 11

试试这个:

let explode s = List.init (String.length s) (String.get s)
Run Code Online (Sandbox Code Playgroud)

  • 注意:OCaml 4.06.0中添加了List.init。 (3认同)

Chr*_*ris 6

从 OCaml 4.07 (2018 年发布)开始,这可以通过序列直接完成。

let string_to_char_list s =
  s |> String.to_seq |> List.of_seq
Run Code Online (Sandbox Code Playgroud)

查看为字符串创建序列的实现可能会有所帮助。在标准库中,这是通过字节类型完成的,但我们可以实现一个简单的函数来直接对字符串执行相同的操作。

let string_to_seq s =
  let rec aux i () =
    if i = String.length s then Seq.Nil
    else Seq.Cons (s.[i], aux @@ i + 1)
  in
  aux 0
Run Code Online (Sandbox Code Playgroud)

或者使用异常:

let string_to_seq s =
  let rec aux i () =
    match String.get s i with
    | ch -> Seq.Cons (ch, aux @@ i + 1)
    | exception Invalid_argument _ -> Seq.Nil
  in
  aux 0
Run Code Online (Sandbox Code Playgroud)

如果我们提供默认值为 的起始索引参数,我们就可以避免嵌套的内部函数0

let rec string_to_seq ?(i=0) s () =
  match String.get s i with
  | ch -> Seq.Cons (ch, string_to_seq ~i: (i+1) s)
  | exception Invalid_argument _ -> Seq.Nil
Run Code Online (Sandbox Code Playgroud)

这让我们可以简单地调用string_to_seq "hello world",但也可以指定一个大于 的初始启动序列0


小智 5

好又简单:

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