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

时间:2017-07-31 08:01:06

标签: 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)"**

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

根据您的代码判断,您似乎假设SS.add s set通过添加元素set来更改集s。它不是。相反,它会使用适当的元素创建一个新集合。所以当你这样做时

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))

soupault的答案向你展示了另一种写同样的方式。