在另一个函数中调用多个函数Ocaml

问题描述:

我想知道是否有反正我可以在另一个函数中调用相同的函数,但使用不同的参数。这是我想要调用的函数的代码。在另一个函数中调用多个函数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

可以使用|>运营商满足您的需求。上面的代码将如下所示:

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

从您的代码判断,您似乎认为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)) 

通过苏波答案显示了不同的方式来写相同。