gpt4 book ai didi

list - 迭代 OCaml 中的嵌套列表数据类型

转载 作者:行者123 更新时间:2023-12-02 18:18:33 32 4
gpt4 key购买 nike

我正在尝试迭代 Jane Street Sexplib module 中定义的 Sexp.t 数据类型。 。我想以显示其递归结构的方式打印数据类型以进行调试。到目前为止,这就是我所拥有的:

type sexp =
| Atom of string
| List of sexp list

(* pretty prints an sexp *)
let rec to_str (se : sexp) : string =
match se with
| Atom s -> s
| List [] -> ""
| List (hd :: tl) -> to_str hd ^ to_str (List tl)

let () =
let se = List [Atom "a"; List [Atom "b"; Atom "c"]; Atom "d"; Atom "e"] in
print_endline (to_str se)

输出是abcde,一个扁平列表。我希望将其打印出来,类似于:

List [Atom "a"; List [Atom "b"; Atom "c"]; Atom "d"; Atom "e"]

我做了一些尝试,但很快就变得困惑了。我只是不确定递归情况应该是什么样子。有人可以帮我吗?

最佳答案

这不是很有效,但对你的函数做了很少的改变,并且应该很容易理解:

let rec to_str (se : sexp) : string =
match se with
| Atom s -> Printf.sprintf "Atom \"%s\"" s
| List [] -> ""
| List items ->
let items = items |> List.map to_str |> String.concat "; " in
Printf.sprintf "List [%s]" items

打印内容

List [Atom "a"; List [Atom "b"; Atom "c"]; Atom "d"; Atom "e"]

为了方便起见,它使用Printf.sprintf,但如果您愿意,仍然可以使用纯字符串连接。更高效的版本可以使用 Format.fprintf 代替。

关于list - 迭代 OCaml 中的嵌套列表数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71204348/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com