У меня есть функция «my_a» в OCaml, что может иметь очень сложный тип возврата:Как передать возвращаемый тип функции в исключение в OCaml?
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*)
Это моя проблема: Я использую BackTrack, чтобы найти решение. Когда исключение backtrack поднимается do_stuff, не было решения, идущего по этому пути. Однако, когда он вызывает исключение типа Continue, это означает, что он нашел решение, но, возможно, это не лучшее решение, вот когда я снова попробую с другим путем. Если есть другое исключение, я хочу вернуть ответ, который он уже нашел.
Дело в том, что для использования этой функции OCaml мне нужно сказать, какой тип данных будет продолжаться. Что возвращения верхнего уровня OCaml, когда я определить my_a:
'a * ('a -> ('a, 'b) symbol list list) ->
'b list -> ('a * ('a, 'b) symbol list) list * 'b list = <fun>
Кто-нибудь есть какие-либо идеи о том, как сделать это, или другое решение, что?
Вы должны сообщить нам, какую проблему вы пытаетесь решить. Поскольку вы считаете, что имена функций могут начинаться с заглавной буквы, и в то же время вы используете исключения в совершенно нетрадиционной форме, мы можем помочь вам намного лучше, если вы позволите нам рассказать вам, как решить вашу первоначальную проблему, а не задайте нам технический вопрос о типах возвратов. –
Привет, я предоставил больше информации, надеюсь, вы сможете мне помочь –
Это звучит неправильно. Если 'Continue' уже произошло, а затем происходит другое' Continue', ваша функция вернет результат, найденный первым 'Continue', но вы скажете в тексте, что вы должны сравнить оба найденных решения, чтобы вы могли использовать лучший , В любом случае, вы не должны структурировать свою программу вокруг таких исключений. –