2017-08-06 42 views
1

我有一个ocaml的问题早解决,但我不知道是否有优化我的解决方案最好的办法,因为我已经尝试了所有的渠道,因为我很新的ocaml的我真的不能看着办吧出。我有一个模式功能,可以很好地打印,然后再添加一组功能。漂亮的打印功能如下:多操作ocaml的

let rec processoperatorchange fmt = function 
| Zero -> Format.fprintf fmt "0" 
| Pproc x -> Format.fprintf fmt "%s" x 
| Procdef (p1, x) -> Format.fprintf fmt "%s(%s)" p1 x 
| Par (p1, p2) -> Format.fprintf fmt "(%a + %a)" processoperatorchange p1 processoperatorchange p2 
| Concur(p1, p2) -> Format.fprintf fmt "(%a | %a)" processoperatorchange p1 processoperatorchange p2 
| Rep(p) -> Format.fprintf fmt "!(%a)" processoperatorchange p 

,我有另一种功能,做同样的事情,但随后改变了印刷的格式(这似乎效率不高,但我不能找出最佳办法,使更好)

let rec processoperatorchange2 fmt = function 
| Zero -> Format.fprintf fmt "0" 
| Pproc x -> Format.fprintf fmt "%s" x 
| Procdef (p1, x) -> Format.fprintf fmt "%s(%s)" p1 x 
| Par (p1, p2) -> Format.fprintf fmt "(%a | %a)" processoperatorchange2 p1 processoperatorchange2 p2 
| Concur(p1, p2) -> Format.fprintf fmt "(%a + %a)" processoperatorchange2 p1 processoperatorchange2 p2 
| Rep(p) -> Format.fprintf fmt "!(%a)" processoperatorchange2 p 

基于这些功能,我有一个调用添加到一个集中的另一个功能:

let op_change p set = concattoset (Format.asprintf "%a" processoperatorchange p) set |> 
        concattoset (Format.asprintf "%a" processoperatorchange2 p) 

concattoset的代码是:

let concattoset s set = SS.add s set 

然而,有没有一种方法,我可以优化这段代码,这样我可以凝聚两种功能processoperatorchangeprocessoperatorchange2成一个功能,并添加这一切设定的?这里的主要问题是我需要从用户执行上的用户定义的输入的变化,那么这个变化增加了一组,如果没有变化,则返回一个空集,但与方式及其现在正在做,如果有没有改变我仍然添加到集合,因为我做了函数调用来分别添加到集合,但是我可以将所有这些集中到一个函数中吗?

回答

2

你的功能,除了用于ParConcur的人物一样。您可以将这些字符作为参数传递。如果调用此函数这样

let rec processoperatorchange pc cc fmt = function 
| Zero -> Format.fprintf fmt "0" 
| Pproc x -> Format.fprintf fmt "%s" x 
| Procdef (p1, x) -> Format.fprintf fmt "%s(%s)" p1 x 
| Par (p1, p2) -> 
    Format.fprintf fmt "(%a %c %a)" 
     (processoperatorchange pc cc) p1 pc (processoperatorchange pc cc) p2 
| Concur(p1, p2) -> 
    Format.fprintf fmt "(%a %c %a)" 
     (processoperatorchange pc cc) p1 cc (processoperatorchange pc cc) p2 
| Rep(p) -> 
    Format.fprintf fmt "!(%a)" 
     (processoperatorchange pc cc) p 

processoperatorchange '+' '|' 

它就像你原来processoperator功能这给了你这样的功能。如果你这样称呼它:

processoperatorchange '|' '+' 

它的行为就像processoperator2

所以你可以重写op_change这样的:

let op_change p set = 
    concattoset (Format.asprintf "%a" (processoperatorchange '+' '|') p) set |> 
    concattoset (Format.asprintf "%a" (processoperatorchange '|' '+') p)