[英]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.