OCaml中的函数包装器/装饰器

时间:2017-01-24 17:58:25

标签: function ocaml wrapper

我有一个带有以下签名的函数:

val func : a -> b -> c -> d -> e -> f -> unit

有时会引发异常。我想更改控制流程,使其看起来像这样:

val funcw : a -> b -> c -> d -> e -> f -> [ `Error of string | `Ok of unit ]

我尝试包装它的方式很难看:创建另一个函数funcw,它接受​​相同数量的参数,对它们应用func,并try / {{1 }}。但必须有一个比这更好的方法。想法?

1 个答案:

答案 0 :(得分:1)

您可以使f成为包装函数的参数。这有点笼统。

let w6 f a b c d e g =
    try `Ok (f a b c d e g) with e -> `Error (Printexc.to_string e)

func的包装版本然后是(w6 func)

此包装器适用于6个参数的curried函数,例如func。您无法为所有不同数量的参数定义单个包装器(因为它们具有不同的类型),但您可以为不同数量的参数定义一个包装器系列,如下所示:

let w1 f x = try `Ok (f x) with e -> `Error (Printexc.to_string e)
let ws f x y =
    match f x with
    | `Ok f' -> (try `Ok (f' y) with e -> `Error (Printexc.to_string e))
    | `Error _ as err -> err
let w2 f = ws (w1 f)
let w3 f x = ws (w2 f x)
let w4 f x y = ws (w3 f x y)
let w5 f x y z = ws (w4 f x y z)
let w6 f x y z w = ws (w5 f x y z w)

可能有一个更整洁的计划,但这似乎很不错。