我想知道无论如何我可以调用相同的函数但在另一个函数中使用不同的参数。这是我想要调用的函数的代码。
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 :(得分: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)
答案 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的答案向你展示了另一种写同样的方式。