2017-08-06 41 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)