我想编写一个函数,它接受一个字符串并返回一个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.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)