Помогите сконвертить код Haskell -> C++0x
Я не настолько силен в Цэ++, чтобы понять, что означает приведенный код.
ну в общем классический Y-combinator на лямдах
std::string str = "fix :: (a -> a) -> a\nfix = \\f -> (\\x -> f (unroll x x $ Roll (\\x -> f (unroll x x";
#include <iostream>
#include <functional>
typedef std::function<int(int)> Func;
struct RecursiveFunc {
std::function<Func(RecursiveFunc)> o;
};
Func fix (std::function<Func(Func)> f) {
RecursiveFunc r = {
[f](RecursiveFunc w) {
return f([w](int x) {
return w.o(wx);
});
}
};
return r.o(r);
}
Func almost_fac (Func f) {
return [f](int n) {
if (n <= 1) return 1;
return n * f(n - 1);
};
}
Func almost_fib (Func f) {
return [f](int n) {
if (n <= 2) return 1;
return f(n - 1) + f(n - 2);
};
}
int main {
auto fib = fix(almost_fib);
auto fac = fix(almost_fac);
std::cout << "fib(10) = " << fib(10) << std::endl;
std::cout << "fac(10) = " << fac(10) << std::endl;
return 0;
}
http://rosettacode.org/wiki/Y_combinator
А в окамле можно без Roll'a:
let fix f g = (fun x a -> f (x x) a) (fun x a -> f (x x) a) g
А в окамле можно без Roll'a:А что тебе в хаскеле мешает написать
fix :: (a -> a) -> a
fix f = f (fix f)
?
А так-то да можно, и в хаскеле и в окамле.
let rec fix f x = f (fix f) x
В том-то и проблема, что в этом примере пришлось фунцию делать именованной, а не анонимной. Мне вот интересно, это принципиально необходимое условие и лямбды языка си убоги, или всё же есть решение чисто на анонимных функциях?
Ну то есть тебе надо, на самом деле, сконвертить в плюсы что-нибудь вроде λf.(λx.f (x x (λx.f (x x?
ага
лямбды языка си убогис этим вроде никто не спорит
Оставить комментарий
yroslavasako
Слыхал я краем уха, что в старых-старых плюсах появились молодые лямбды. Протранслируйте, кто их уже выучил новый синтаксис, пожалуйста код, чтобы я смог свой компилятор проверить.