如何在OCaml顶层环境中完整显示长列表?
嘿,这个问题我之前调试OCaml代码时也碰到过!OCaml的交互环境(toplevel)默认会对过长的列表输出进行截断,用[...]省略后面的元素,不过有几个简单的办法能解决这个问题:
全局调整toplevel的打印长度限制
OCaml的toplevel内置了一个print_length参数,它控制着打印列表(或其他可迭代结构)时最多显示的元素数量,默认值一般是200左右,超过就会截断。你可以在交互环境里执行这条命令来取消限制:# set print_length max_int;;执行完之后,再输入你的长列表名称,就能看到所有元素了。要是之后想恢复默认限制,把
max_int换成原来的数值(比如200)就行。手动遍历列表逐个打印元素
如果你不想全局修改参数,或者需要自定义每个元素的打印格式,直接用List.iter来手动打印是个更灵活的选择。比如你的长列表是整数类型的my_long_list,可以这么写:List.iter (fun elem -> print_endline (string_of_int elem)) my_long_list;;要是列表里是其他类型,把
string_of_int换成对应的转换函数就好——比如string_of_float处理浮点数,string_of_bool处理布尔值,要是自定义类型,自己写个转换函数就行。给自定义类型安装专属打印机(可选)
如果你是自己定义的类型的长列表,还可以给这个类型安装一个自定义打印机,让OCaml默认就用它来输出。比如假设你定义了这样的类型:type my_type = A of int | B of string先写一个打印函数:
let print_my_type fmt = function | A n -> Format.fprintf fmt "A(%d)" n | B s -> Format.fprintf fmt "B(%s)" s然后在toplevel里安装这个打印机:
#install_printer print_my_type;;之后你的
my_type list就会用这个自定义格式输出啦(不过还是要配合前面的print_length设置,不然超过限制还是会被截断)。
总的来说,第一个方法最省事,适合临时查看长列表;第二个方法更灵活,适合需要定制输出的场景~
内容的提问来源于stack exchange,提问作者ZoCode

