【发布时间】:2013-01-11 09:30:52
【问题描述】:
我在 OCaml 中有函数“my_a”,它可能有一个非常复杂的返回类型:
exception Backtrack
exception Continue of (* How do I put the type of function 'my_a' here? *)
let my_a arg = try do_stuff (List.hd arg)
with
| Backtrack -> my_a (List.tl arg)
| Continue (found_answer) -> (try my_a (List.tl arg)
with
| Backtrack -> raise Continue(found_answer)
| Continue (other_answer) ->
raise Continue (compare_answer(found_answer,other_answer));;
(* the caller of my_a will handle the Continue exception to catch the found value
if something was found*)
这是我的问题:我正在使用回溯来寻找解决方案。当 do_stuff 引发回溯异常时,没有解决方案走这条路。但是,当它引发 Continue 类型的异常时,这意味着它找到了解决方案,但是,它可能不是最好的解决方案,那就是当我用不同的路径再次尝试时。如果还有其他异常,我想返回它已经找到的答案。
问题是,为了能够使用 OCaml 的该功能,我需要告诉它 Continue 将携带什么数据类型。当我定义 my_a 时,OCaml 顶层返回什么:
'a * ('a -> ('a, 'b) symbol list list) ->
'b list -> ('a * ('a, 'b) symbol list) list * 'b list = <fun>
有没有人知道如何做到这一点,或者有不同的解决方案?
【问题讨论】:
-
您应该告诉我们您要解决的问题。由于您认为函数名称可以以大写字母开头,同时您以非常规的方式使用异常,如果您允许我们告诉您如何解决您的原始问题,我们可以更好地帮助您,而不是向我们询问有关返回类型的具体技术问题。
-
您好,我提供了更多信息,希望您能帮助我
-
这听起来不对。如果
Continue已经发生,然后另一个Continue发生,您的函数将返回第一个Continue找到的结果,但是您在文中说您应该比较找到的两种解决方案,以便您可以使用更好的解决方案.在任何情况下,您都不应该围绕这样的异常来构建您的程序。 -
在搜索整个空间之前,您无法知道最佳解决方案,因此这只是一个详尽的搜索。或者你打算在某个时候修剪搜索?
-
好吧,我确实打算返回最佳解决方案,忽略任何其他选择。我想我应该显示更多关于我的想法的信息。问题是我有点无法完全实现它。
标签: exception ocaml return-type