2017-07-31 89 views
1

我想知道是否有反正我可以在另一個函數中調用相同的函數,但使用不同的參數。這是我想要調用的函數的代碼。在另一個函數中調用多個函數Ocaml

let concattoset s set = SS.add s set 

有了這個功能,我有一個調用這個函數,但有可能做這樣的事情的另一個功能:

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

我知道,每當我這樣做,最後的期限,並將在此之前的任何其他術語被忽略。有沒有可能爲此找出最佳方法,或者如果可能的話,可以採取其他方式來做到這一點?

在匹配模式中的類似情況下,可以使用相同的運算符。因此,舉例來說,這是我的匹配功能:

let rec processoperatorchange4 fmt = function 
| Zero -> Format.fprintf fmt "0" 
| Pproc x -> Format.fprintf fmt "%s" x 
| Procdef (p1, x) -> Format.fprintf fmt "%a(%s)" processoperatorchange4 p1 x 
**| Par (p1, p2) -> Format.fprintf fmt "(%a | %a)" processoperatorchange4 p1 processoperatorchange4 p2 |> Format.fprintf fmt "(%a + %a)"** 
+0

'let concattoset s set = SS.add s set1'中的set1是什麼? – soupault

+0

這是一個錯字,我已經更新了我的問題 – user1514567

回答

3

可以使用|>運營商滿足您的需求。上面的代碼將如下所示:

let concattoset s set = SS.add s set 

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

另請參閱OCaml |> operator

+0

感謝你的支持。我編輯了我的問題,並跟進了關於使用與模式匹配相似的想法 – user1514567

1

從您的代碼判斷,您似乎認爲SS.add s set通過添加元素s來更改集set。它不是。相反,它會創建一個具有適當元素的新集合。所以,當你做

SS.add a1 set; 
SS.add a2 set; 
SS.add a3 set 

你創建一組包含a1除了是什麼set

然後你丟棄集並創建一套包含a2除了什麼是set(不包含a1(除非它是沒有從一開始))。

然後你丟棄集以及並創建一套包含a3除了什麼是set(既不含a1也不a2(除非...))。 最後一組是結果。一直以來,set保持不變。

你應該做的不是放棄中間結果,而是建立在它們之上。像這樣:

let set1 = SS.add a1 set in 
let set2 = SS.add s2 set1 in 
SS.add a3 set2 

,或者在一氣呵成:

SS.add a3 (SS.add a2 (SS.add a1 set)) 

通過蘇波答案顯示了不同的方式來寫相同。