Re[5]: Функциональное программирование для всех
От: Кодт Россия  
Дата: 16.10.06 15:42
Оценка: 2 (2)
Здравствуйте, 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>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.