一个匹配模式Ocaml中的多个操作

一个匹配模式Ocaml中的多个操作,ocaml,Ocaml,我之前解决了一个Ocaml问题,但是我想知道是否有一个最佳的方法来优化我的解决方案,因为我已经尝试了所有的方法,而且因为我对Ocaml非常陌生,所以我无法真正理解它。我有一个模式函数,可以进行漂亮的打印,然后还有一个函数可以添加到集合中。打印功能如下: let rec processoperatorchange fmt = function | Zero -> Format.fprintf fmt "0" | Pproc x -> Format.fprintf fmt "%s" x

我之前解决了一个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 op_change p set = concattoset (Format.asprintf "%a" processoperatorchange p) set |>
                    concattoset (Format.asprintf "%a" processoperatorchange2 p)
concatotset
的代码为:

let concattoset s set = SS.add s set

但是,是否有一种方法可以优化此代码,以便将两个函数
processoperatorchange
processoperatorchange2
压缩为一个函数,并将所有这些函数添加到集合中?这里的主要问题是,我需要对用户定义的输入执行更改,然后将此更改添加到集合中,如果没有更改,则返回一个空集合,但返回方式与现在一样,如果没有变化,我仍然会添加到集合中,因为我会单独调用函数来添加到集合中,但是我可以将所有这些压缩到一个函数中吗

除了用于
Par
Concur
的字符外,您的函数是相同的。可以将这些字符作为参数传递。这将为您提供如下功能:

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 '+' '|'
processoperatorchange '|' '+'
let op_change p set =
    concattoset (Format.asprintf "%a" (processoperatorchange '+' '|') p) set |>
    concattoset (Format.asprintf "%a" (processoperatorchange '|' '+') p)
如果您这样调用此函数:

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 '+' '|'
processoperatorchange '|' '+'
let op_change p set =
    concattoset (Format.asprintf "%a" (processoperatorchange '+' '|') p) set |>
    concattoset (Format.asprintf "%a" (processoperatorchange '|' '+') p)
它的作用类似于原始的
processoperator
函数。如果你这样称呼它:

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 '+' '|'
processoperatorchange '|' '+'
let op_change p set =
    concattoset (Format.asprintf "%a" (processoperatorchange '+' '|') p) set |>
    concattoset (Format.asprintf "%a" (processoperatorchange '|' '+') p)
它的作用类似于
processoperator2

所以你可以像这样重写
op_change

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 '+' '|'
processoperatorchange '|' '+'
let op_change p set =
    concattoset (Format.asprintf "%a" (processoperatorchange '+' '|') p) set |>
    concattoset (Format.asprintf "%a" (processoperatorchange '|' '+') p)