将字符列表列表转换为OCAML中的字符串列表

时间:2018-02-12 17:52:34

标签: list char ocaml

我有一个例子:

val lst1 : char list list =
  [['l'; 'a'; 'n'; 'e']; ['p'; 'l'; 'a'; 'n'; 'e'; 't']; ['m'; 'o'; 'o'; 't'];
   []; []; ['s'; 'm'; 'o'; 'o'; 't'; 'h']; ['h'; 'a'; 'n'; 'g']; []; 
   []; ['c'; 'h'; 'a'; 'n'; 'g'; 'e']; ['w'; 'e'; 'n'; 't']; []; []; etc.]

将此列表转换为以下内容的技巧是什么:

["lane";"planet";...]?

谢谢。

2 个答案:

答案 0 :(得分:0)

这应该这样做,

let to_string l =
  let rec loop buf = function
    | [] -> Buffer.contents buf
    | x :: tl -> Buffer.add_char buf x; loop buf tl
  in
  loop (Buffer.create 100) l

let to_str_lst l = List.map to_string l

to_string的替代版本没有rec -

let to_string l =
  List.fold_left
    (fun acc e -> Buffer.add_char acc e; acc)
    (Buffer.create 100)
    l
  |> Buffer.contents

utop中的示例用法:

to_str_lst [['h';'e';'l';'l';'o']; ['w';'o';'r';'l';'d']];;

返回

- : string list = ["hello"; "world"]

答案 1 :(得分:0)

这是一个非常紧凑的实现:

let to_str_list =
  List.map (fun cs -> String.concat "" (List.map (String.make 1) cs))

当你打电话时它看起来像这样:

# to_str_list [['h';'e';'l';'l';'o'];['w';'o';'r';'l';'d']];;
- : string list = ["hello"; "world"]

<强>更新

如果要在外层抑制空字符串,可以执行以下操作:

let to_str_list css =
  List.map (fun cs -> String.concat "" (List.map (String.make 1) cs)) css |>
  List.filter ((<>) "")

当你打电话时它看起来像这样:

# to_str_list [['h';'e';'l';'l';'o']; []; ['w';'o';'r';'l';'d']];;
- : string list = ["hello"; "world"]