如何在OCaml中将字符列表转换为字符串?

7

我有一个字符列表 ['a';'b';'c']

如何将它转换为字符串 "abc"?

谢谢 x

4个回答

8
您可以创建一个与列表长度相等的字符串,然后使用计数器对列表进行折叠,并使用列表内容初始化该字符串... 但是,自OCaml 4.02开始,字符串类型开始朝着不可变性的方向转变(并在4.06中变为不可变),您应该将字符串视为不可变的数据结构。因此,让我们尝试另一种解决方案。有一个专门用于字符串构建的Buffer模块。
# let buf = Buffer.create 16;;
val buf : Buffer.t = <abstr>
# List.iter (Buffer.add_char buf) ['a'; 'b'; 'c'];;
- : unit = ()
# Buffer.contents buf;;
- : string = "abc"

或者,作为一个函数:

let string_of_chars chars = 
  let buf = Buffer.create 16 in
  List.iter (Buffer.add_char buf) chars;
  Buffer.contents buf

6
let cl2s cl = String.concat "" (List.map (String.make 1) cl)

3
如果列表太长,这个解决方案会产生堆栈溢出。在这种情况下,请使用Ivg的解决方案。顺便说一句,batteries包含了String.of_list - nickie

5

从OCaml 4.07开始,您可以使用序列轻松完成此操作。

let l = ['a';'b';'c'] in
let s = String.of_seq (List.to_seq l) in
assert ( s = "abc" )

1
常用的 Base 库还提供了 Base.String.of_char_list

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接