繁体   English   中英

OCaml中的功能包装器/装饰器

[英]Function wrapper/decorator in OCaml

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

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 / with 但是必须有比这更好的方法。 有什么想法吗?

您可以将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个参数的函数,例如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)

可能会有一个整理方案,但这似乎还不错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM