considerar mis proyectos de investigación 3:
Este proyecto es un prototipo de trabajo del juego 'Amber'. El código demuestra muchos de los principales conceptos funcionales: immutability
, lambdas
, monads
, combinators
, pure functions
, declarative code design
. Utiliza las características Qt C++ y C++ 11.
Para un ejemplo rápido, ver cómo las tareas se pueden encadenar en una gran tarea que va a modificar el mundo del ámbar cuando se aplica:
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;
};
Esta es una muestra de lentes funcionales genéricos en C++. La implementación está construida con el uso de Variadic Templates
, algunos hacks de C++ interesantes (y válidos) para hacer que las lentes sean compostables y aseadas. La biblioteca es solo una demostración de la charla y proporciona solo algunos de los más importantes combinadores, a saber: set()
, view()
, traverse()
, bind()
, infix literal combinator to
, over()
y otros.
(Tenga en cuenta que existen los 'C++ Lenses' project: pero no se trata de 'lentes' reales, se trata de propiedades de la clase con captadores y definidores en el sentido de C propiedades de Java # o.)
Ejemplo rápido
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");
es probable que haya oído hablar de las mónadas. Las mónadas están en todas partes en conversaciones sobre programación funcional ahora. Es una palabra de moda. ¿Pero qué hay de las comonads? Presenté autómatas celulares 1D y 2D con el concepto de comonads bajo el capó. El objetivo era mostrar cuán fácil es pasar del código de flujo único al paralelo utilizando std :: future como mónada Par. El proyecto también compara y compara dos de estos enfoques.
Ejemplo rápido
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 };
}
Usted es mejor de usar un lenguaje de programación funcional (LISP, Haskell, Esquema, ...). De esta manera, está seguro de que lo que está haciendo es, de hecho, una programación funcional. –
¿Qué tipo de características de FP está buscando? Boost proporciona algunas bibliotecas tipo FP (mpl, función, lambda, etc.) y algunas de ellas estarán en C++ 0x y ya están en TR1. – Macke
@Brian: Solo quiero sentirme de FP sin aprender un nuevo idioma. Y ahora solo sé C++ y Java. Y Java supongo que sería una opción aún peor para FP. –