Итак, я работаю над функцией, чтобы найти некоторые действительные арифметические операции с целевым номером из списка int. Нельзя использовать throw/callac. Здесь только add и mul являются действительными арифметическими операциями, и они остаются ассоциативными.Как проверить результаты рекурсивного вызова в кодах CPS
datatype operation = ADD | MULT
(* find_op: int -> int list -> (operatino list -> 'a) -> (unit -> 'a) -> 'a *)
fun find_op x [] s k = k()
| find_op x [y] s k = if x=y then s([]) else k()
| find_op x (y1::y2::ys) s k =
let
val add = find_op x ((y1+y2)::ys) (fn a => s(ADD::a)) k
val mul = find_op x ((y1*y2)::ys) (fn a => s(MULT::a)) k
in
need some work here
end
Функция должна работать, как показано ниже:
Данный список [1,1,2, ~ 1] и целевое число ~ 4, ACCPETED список операций должно быть [ADD, ADD, Mult] или [ADD, MULT, MULT], потому что (((1 + 1) +2) * ~ 1) = ((1 + 1) ~ 1) = ~ 4. Но [MULT, ADD, MULT] не будет действительным, так как (((1 * 1) +2) * ~ 1) = ~ 3.
Я смущен, как проверить, были ли возвращенные результаты k(). Использование = для проверки возвращаемого значения невозможно, так как оно является полиморфным. Есть ли способ справиться с этим?
Это не очень понятно мне, что эта функция должна выполнить, но я уверен, что решение лежит в «украшающие» продолжений 'k' отправляется рекурсивных вызовов в' find_op'. Скорее всего, 'k', переданный для' add', должен вычислять 'mult'. Не уверен, что должно произойти дальше. –
, но k имеет блок типа -> 'a, он не может принимать аргументы, не так ли? – EBADF
Действительно, это невозможно. Можете ли вы показать пример ввода и вывода для этой функции, которую вы пытаетесь написать? Возможно, я смогу понять, что вы пытаетесь сделать. –