2017-02-09 45 views
1

第44行它给了我一个类型的错误键入自动不兼容formatter型IM试图绘制使用graphviz 这里的自动机的代码:如何纠正函数式编程中的这个错误?

(*d'abord definissons le type automate*) 

type automate = { 
etat_initial : int; 
ensemble_des_etats : int list; 
alphabets : char list; 
transitions :(int*char*int) list; 
etats_finaux : int list 
};; 

(*prenons une variable a1 du type automate qu'on a definit precedemment 
    comme 
    exemple*) 

let a1={ 
etat_initial=1; 
ensemble_des_etats=[1;2]; 
alphabets=['a';'b']; 
transitions=[(1,'b',2);(2,'c',3)]; 
etats_finaux=[2] 
};; 

let rec member a l = 
match l with 
| [] -> false 
| x::rl -> x=a || member a rl;; 


let fmt_transition auto fmt (inedge,by,outedge)= 
if member outedge auto.etats_finaux=true then 
Format.fprintf fmt "@[node [shape = doublecircle]%d;@]" outedge; 
if inedge=auto.etat_initial then 
Format.fprintf fmt "@[node [shape = point]start;node [shape = circle];start 
-> %d ;@]" inedge; 
Format.fprintf fmt "@[%d -> %d [label=\"%c\"];@]" inedge outedge by;; 

let fmt_transitions auto fmt = 
Format.fprintf fmt "@[<v 2>digraph output {@,%[email protected],@]}@,@." 
(Format.pp_print_list (fmt_transition auto)) auto.transitions 
;; 

let call_dot auto = 
let cmd = "dot -Tpng | display -" in 
let (sout, sin, serr) as channels = 
Unix.open_process_full cmd (Unix.environment()) in 
let fmt = Format.formatter_of_out_channel sin in 
<b>Format.fprintf fmt "%[email protected]" fmt_transitions auto;</b> 
channels 

let cleanup channels = 
(* missing: flush channels, empty buffers *) 
Unix.close_process_full channels;; 

call_dot a1 ;; 
+0

也涉及到了问题[我怎么能代表图形的自动机从较不使用循环过渡INT *字符*为int的列表(http://stackoverflow.com/questions/41780982/how- can-i-represent-an-automaton-graphics-from-a-list-of-intcharint-represe)和[如何绘制自动机图?](http://stackoverflow.com/questions/41901071/how-to -draw-AN-自动机-图)。 –

回答

1

您需要的时候使用%a要小心。 根据OCaml文档:

a:用户定义的打印机。取两个参数并将第一个参数应用于outchan(当前输出通道)和第二个参数。 第一个参数,因此必须有类型out_channel - >“B - >单元 ...

fmt_transitions auto fmt函数的第一个参数一个参数必须是格式化,所以只需切换autofmt参数和它应该是可以的。

let fmt_transitions auto fmt = ... 

let fmt_transitions fmt auto = ... 
+0

非常感谢! –

相关问题