2017-02-09 41 views
1

на 44-й линии, это дает мне тип ошибки типа Автовыполнение не совместим с типом formatter им пытаются сделать автомат с помощью 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 * полукокс * межд, представляющих переходы без использования петли] (http://stackoverflow.com/questions/41780982/how- can-i-present-an-automaton-graphically-from-a-list-of-intcharint-represe) и [как рисовать автоматную диаграмму?] (http://stackoverflow.com/questions/41901071/how-to -Ничья-ан-автомат-диаграмма). –

ответ

1

Вы должны быть осторожны при использовании %a , Согласно документации OCaml:

a: пользовательский принтер. Возьмите два аргумента и примените первый к outchan (текущий выходной канал) и ко второму аргументу. Первый аргумент, следовательно, должны иметь тип out_channel -> «б -> блок ...

Первый аргумент аргумент вашей fmt_transitions auto fmt функции должен быть форматчик, поэтому просто включите в auto и fmt аргументы и это должно быть хорошо.

let fmt_transitions auto fmt = ... 

let fmt_transitions fmt auto = ... 
+0

большое спасибо! –