Помогите сконвертить код Haskell -> C++0x

yroslavasako

Слыхал я краем уха, что в старых-старых плюсах появились молодые лямбды. Протранслируйте, кто их уже выучил новый синтаксис, пожалуйста код, чтобы я смог свой компилятор проверить.

fix :: (a -> a) -> a
fix = \f -> (\x -> f (unroll x x $ Roll (\x -> f (unroll x x

marat7256

Я не настолько силен в Цэ++, чтобы понять, что означает приведенный код.

yroslavasako

ну в общем классический Y-combinator на лямдах

evgen5555


std::string str = "fix :: (a -> a) -> a\nfix = \\f -> (\\x -> f (unroll x x $ Roll (\\x -> f (unroll x x";

karkar

 
#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  

apl13

А в окамле можно без Roll'a:
А что тебе в хаскеле мешает написать
fix :: (a -> a) -> a
fix f = f (fix f)

?

karkar

На том сайте, где взяты эти примеры, это "disallowed by the task".
А так-то да можно, и в хаскеле и в окамле.
let rec fix f x = f (fix f) x

yroslavasako

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

apl13

Ну то есть тебе надо, на самом деле, сконвертить в плюсы что-нибудь вроде λf.(λx.f (x x (λx.f (x x?

yroslavasako

ага

Maurog

лямбды языка си убоги
с этим вроде никто не спорит :shocked:
Оставить комментарий
Имя или ник:
Комментарий: