我有一个带有以下签名的函数:
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 }}。但必须有一个比这更好的方法。想法?
答案 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)
可能有一个更整洁的计划,但这似乎很不错。