произведение списка с использованием продолжения - PullRequest
0 голосов
/ 12 декабря 2018

моя цель - написать функцию типа int list -> int, которая принимает список int с и, , используя продолжения , возвращает int так, что int = умножениеиз всех int с int list.например, times [2;2;3] возвращает 12.

Вот что у меня есть:

let times l = 
 let rec times' l c = match l with
 | [] -> c []
 | h::h2::t -> times' (h*h2::t) (fun r -> c ( r))
 | h :: [] -> times' [] (fun r -> c (h::[]))
 in
  times' l (fun r -> r) ;; 

Проблемы с моим кодом

  1. itвозвращает список целых чисел с одним элементом, который является результатом (умножение всех int s на введенное значение int list)

  2. Мне кажется, что на самом деле не используются продолжения, это кажетсябыть нормальной хвостовой рекурсивной функцией, но я не уверен, так как я все еще не очень знаком с этим стилем программирования.

1 Ответ

0 голосов
/ 14 декабря 2018

Вы выполняли вычисления в аргументах в виде рекурсивных вызовов, но вы должны делать это в продолжение.Что касается CPS, то вам нужно «увеличить» данное продолжение.

let times l =
  let rec aux l c =
    match l with
    | [] -> c 1  (* I assume that (times []) is one, and pass it to the next computation c. *)
    | n::ns -> aux ns (fun x -> c (n * x))  (* In a new continuation: For a given value x, multiply by n, and pass it to the next computation c. *)
  in aux l (fun r -> r)

Также приведены примеры, которые объясняют различия между CPS и прямым стилем, написанные в «Стиль передачи продолжения» в википедии может помочь.

...