[英]Convert a char list list into a char string list in 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";...]?
谢谢你。
这个应该可以
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
没有rec
的to_string
替代版本 -
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"]
这是一个非常紧凑的实现:
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"]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.