Рассмотрим мои 3 исследовательских проекты:
Этот проект является рабочим прототипом игры 'Амбер'. Код демонстрирует многие из основных функциональных концепций: immutability
, lambdas
, monads
, combinators
, pure functions
, declarative code design
. Он использует Qt C++ и C++ 11.
Для быстрого примера, посмотрим, как задачи могут быть соединены в одну большую задачу, которая будет изменять мир Янтарная, когда он применяется:
const AmberTask tickOneAmberHour = [](const amber::Amber& amber)
{
auto action1Res = magic::anyway(inflateShadowStorms, magic::wrap(amber));
auto action2Res = magic::anyway(affectShadowStorms, action1Res);
auto action3Res = magic::onFail(shadowStabilization, action2Res);
auto action4Res = magic::anyway(tickWorldTime, action3Res);
return action4Res.amber;
};
Это витрина общих функциональных линз в C++. Реализован построенный с использованием Variadic Templates
, некоторые интересные (и действительные) C++ хаки, чтобы сделать объективы удобными и аккуратными. Библиотека представляет собой просто демонстрацию для разговора и, таким образом, она содержит только несколько наиболее важных комбинаторов, а именно: set()
, view()
, traverse()
, bind()
, инфикс-литеральный комбинатор to
, over()
и другие.
(Обратите внимание, что существуют "линзы C++ project: но это не о реальных«линз», это о свойствах класса с добытчиками и сеттеров в смысле C# или Java свойств.)
Быстрый пример
Car car1 = {"x555xx", "Ford Focus", 0, {}};
Car car2 = {"y555yy", "Toyota Corolla", 10000, {}};
std::vector<Car> cars = {car1, car2};
auto zoomer = traversed<Car>() to modelL();
std::function<std::string(std::string)> variator = [](std::string) { return std::string("BMW x6"); };
std::vector<Car> result = over(zoomer, cars, variator);
QVERIFY(result.size() == 2);
QVERIFY(result[0].model == "BMW x6");
QVERIFY(result[1].model == "BMW x6");
Вы, наверное, слышали о монады. Монады повсюду говорят о функциональном программировании. Это модное слово. Но как насчет comonads? Я представил 1D и 2D celullar автоматы с концепцией comonads под капотом. Цель состояла в том, чтобы показать, насколько легко перейти от однопоточного кода к параллельному, используя std :: future как Par monad. Проект также ориентирует и сравнивает два этих подхода.
Быстрый пример
template <typename A, typename B>
UUB fmap(
const func<B(UUA)>& f,
const UUUUA& uuu)
{
const func<UB(UUUA)> f2 = [=](const UUUA& uuu2)
{
UB newUt;
newUt.position = uuu2.position;
newUt.field = fp::map(f, uuu2.field);
return newUt;
};
return { fp::map(f2, uuu.field), uuu.position };
}
Вы лучше с помощью функционального языка программирования (LISP, Haskell, Scheme, ...). Таким образом, вы уверены, что вы выполняете функциональное программирование. –
Какие функции FP вы ищете? Boost предоставляет некоторые FP-подобные библиотеки (mpl, function, lambda и т. Д.), А некоторые из них будут в C++ 0x и уже находятся в TR1. – Macke
@Brian: Я просто хочу почувствовать FP, не изучая новый язык. И прямо сейчас я знаю только C++ и Java. И Java, я думаю, будет еще хуже для FP. –