Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ocamldebug中打印多态类型的表达式_Ocaml - Fatal编程技术网

在ocamldebug中打印多态类型的表达式

在ocamldebug中打印多态类型的表达式,ocaml,Ocaml,假设我们有一个要调试的多态函数,例如: let rec rev lst = match lst with | [] -> [] | x::xs -> List.append (rev xs) [x] 为了使其成为一个程序,我们添加了一个主函数: let () = ignore (rev [1;2;3;4]) 结果是不相关的,但注意rev是用int列表调用的,即非多态类型 当我在ocamldebug中调试执行时,当我打印list参数时,我只会得到一个通用列表: (ocd)

假设我们有一个要调试的多态函数,例如:

let rec rev lst = match lst with
  | [] -> []
  | x::xs -> List.append (rev xs) [x]
为了使其成为一个程序,我们添加了一个主函数:

let () = ignore (rev [1;2;3;4])
结果是不相关的,但注意rev是用int列表调用的,即非多态类型

当我在ocamldebug中调试执行时,当我打印list参数时,我只会得到一个通用列表:

(ocd) break @ Rev 1
(ocd) run
Breakpoint: 1
1 let rec rev lst = <|b|>match lst with
(ocd) print lst
lst: 'a list = [<poly>; <poly>; <poly>; <poly>]
顶层正确地报告类型为
Format.formatter->int list->unit
。ocamldebug会话现在如下所示:

(ocd) load_printer pp.cmo
File ./pp.cmo loaded
(ocd)  install_printer Pp.int_list
(ocd)  break @ Rev 1
Loading program... done.
Breakpoint 1 at 14768 : file rev.ml, line 1, characters 19-84
(ocd) 
(ocd) run
Time : 12 - pc : 14768 - module Rev
Breakpoint : 1
1 let rec rev lst = <|b|>match lst with
(ocd) print lst
lst : 'a list = [<poly>; <poly>; <poly>; <poly>]
(ocd)加载打印机pp.cmo
已加载文件。/pp.cmo
(ocd)安装打印机Pp.int\u列表
(ocd)在第1版时中断
正在加载程序。。。完成。
14768处的断点1:file rev.ml,第1行,字符19-84
(强迫症)
(ocd)运行
时间:12-pc:14768-模块版本
断点:1
1让rec rev lst=将lst与
(ocd)打印lst
lst:“列表=[;;;]

但是ocamldebug似乎没有使用
int\u list
,需要一个多态的
'a list

您可以用同样的方式安装用户打印机,就像在顶级安装一样。名为
install\u printer
中的命令,如中所述。例如,如果元素类型是抽象的,但提供了一个
to_string
函数,则可以为其编写打印机:

let pp ch x = Format.fprintf ch "%s" (to_string x)
然后按照上述指令安装打印机

更新 以上内容仅适用于打印具体类型。无法打印抽象值。唯一的方法是将其(临时)限制为混凝土类型:

给定一个约束程序:

let rec rev lst : int list = match lst with
  | [] -> []
  | x::xs -> List.append (rev xs) [x]
ocd将打印以下列表:

Loading program... done.
Breakpoint 1 at 21448: file test.ml, line 1, characters 30-95
(ocd) run
Time: 12 - pc: 21448 - module Test
Breakpoint: 1
1 let rec rev lst : int list = <|b|>match lst with
(ocd) p lst 
lst: int list = [1; 2; 3]
正在加载程序。。。完成。
21448处的断点1:file test.ml,第1行,字符30-95
(ocd)运行
时间:12-pc:21448-模块测试
断点:1
1让rec rev lst:int list=将lst与
(ocd)p lst
lst:int list=[1;2;3]

安装打印机的诀窍将使您免于使用抽象类型,而不是多态类型。

感谢指针-不知何故,ocamldebug没有使用自定义打印功能。我应该提出一个新问题,还是你想回答这个问题?不管怎样,我更新了这个问题。谢谢你的额外解释-这就是我最终要做的,但是当通用代码真的用于不同的类型时,这是一个令人讨厌的问题。
Loading program... done.
Breakpoint 1 at 21448: file test.ml, line 1, characters 30-95
(ocd) run
Time: 12 - pc: 21448 - module Test
Breakpoint: 1
1 let rec rev lst : int list = <|b|>match lst with
(ocd) p lst 
lst: int list = [1; 2; 3]