gpt4 book ai didi

exception-handling - OCaml中的异常处理

转载 作者:行者123 更新时间:2023-12-04 00:13:01 24 4
gpt4 key购买 nike

我必须编写类型为try_finalyze f g y x的函数('a -> 'b) -> ('b -> 'c) -> 'c -> 'a -> 'c
知道:

1.如果f x引发异常,则返回值必须为y

2.如果f x没有引发任何异常,我们必须返回应用于gf x的结果

  exception E

let try_finalyze f g y x = try g (f x) with E -> y;;

val try_finalyze : ('a -> 'b) -> ('b -> 'c) -> 'c -> 'a -> 'c = <fun>


1.我该如何处理问题?

2.在这种情况下,将执行以下功能:

fun f -> try_finalyze f (fun x-> Some x) None


我看不到 (fun x-> Some x)这样的函数的作用

最佳答案

如果你写

let try_finalize f g y x = try g (f x) with _ -> y


如果 y不会引发错误,但 f会引发错误,则函数将返回 g,这不是您想要的。
为了确保仅捕获来自 f的错误,应在try块中单独放置 f x

let try_finalize f g y x =
let z = try Some (f x) with _ -> None in
match z with
| Some z -> g z
| None -> y


在纯函数代码中,异常可能被认为是不好的样式,这就是为什么您可能想要将可能引发异常的函数(如 List.assoc : 'a -> ('a * 'b) list -> 'b)转换为功能相同但返回选项的函数。
那就是

let with_option f = try_finalize f (fun x-> Some x) None


做。

关于exception-handling - OCaml中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23688184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com