Здравствуйте, Lazy Cjow Rhrr, Вы писали:
PVA>>А реализовано может быть через те же функторы.
LCR>Это вы делаете вывод исходя из ошибочного предположения, что функции высшего порядка == функторы. А на самом деле функторами можно эмулировать ФВП (так же как это делает компилятор написанный на C).
LCR>Я с удовольствием послушаю, как вы реализуете на функторах функцию iterate:
LCR>let compose f g x = f(g x) ;;
LCR>let rec iterate n f =
LCR> if n = 0 then (function x -> x)
LCR> else compose f (iterate (n-1) f) ;;
LCR>(* использовать можно так *)
LCR>let rec power i n =
LCR> let i_times = ( * ) i in (* "i_times n" равно функции "умножить на i" n раз *)
LCR> iterate n i_times 1 ;;
LCR>power 2 8 ;; (* выдаст 256 *)
LCR>(ocaml)
LCR>Больше чем уверен, что вы вернёте разве что функтор-интерпретатор, который будет инкапсулировать АСТ.
Во-первых: а что здесь вообще можно вернуть? Какой код порождает компилятор caml?
— строит AST
— приводит к форме, свободной от переменных, т.е. к коду для комбинаторной машины — опять же, в каком базисе? есть ли там Y-комбинатор?
— выполняет преобразования, в ходе которых создаёт концевую рекурсию, а её, в свою очередь, переводит в итерации
let iterate n f (* x *) =
let rec iter m x =
if m=0 then x
else f (iter (m-1))
in iter n (* x *)
;;
(*******************************)
let iterate n f (* x *) =
let rec iter m x =
if m=0 then x
else iter (m-1) (f x)
in iter n (* x *)
;;
Во-вторых, если не следовать заданию до последней буквы, то именно итерационную версию и можно написать
template<class F>
class iterate_n_f
{
int n;
F f;
public:
iterate_n_f(int n, F f) : n(n), f(f) {}
template<class X> X operator()(X x) const { for(int i=0; i!=n; ++i) x = f(x); return x; }
};
// карринг сделайте сами
... << RSDN@Home 1.2.0 alpha rev. 655>>