我根据许多人给我的建议使用graphviz
,但我遇到了问题。我想使用ocaml
在Format.module
中写一个点,我有一个包含五个字段的记录,这些字段定义了一个自动机,包括由int*char*int
列表和最终状态表示的转换。由int
列表表示。第一个字段是初始状态,即一个int
。我还定义了一个函数成员,它接受一个参数并测试它是否是给定列表的成员。我怎么能这样做,我可以写一个完整的点来识别初始状态并用节点[shape = point]start ; start -> x
表示它,其他过渡用圆圈表示,最后的状态用双圈表示?我尝试过这样做,但是遇到问题当我编译它时,它说
文件“automatagraphicstest1.ml”,第44行,字符22-37:错误: 这个表达式有类型 自动化 - > Format.formatter - > int * char * int - >单元 但是表达式的格式是Format.formatter - > 'a - >单元 类型automate与Format.formatter类型
不兼容
答案 0 :(得分:0)
要修复类型错误,只需将fmt_transitions
函数替换为:
let fmt_transitions fmt auto =
Format.fprintf fmt "@[<v 2>digraph output {@,%a@,@]}@,@."
(Format.pp_print_list (fmt_transition1 auto)) auto.transitions
您的问题是pp_print_list
需要Format.formatter -> 'a -> unit
类型的内容。你的函数fmt_automaton1
将自动机作为额外的第一个参数,所以我们需要先部分应用它,然后我们才能提供转换列表。