赞
踩
UPD 2018年12月
我已经创建了完整的材料清单,您可以在其中找到文章,演讲,截屏视频,论文,图书馆和展示柜:
C ++中的函数式编程
考虑我的4个研究项目:
C ++中的功能和声明性设计。 (GitHub)(幻灯片(Rus))(对话(Rus))
该项目是“琥珀”游戏的工作原型。 该代码演示了许多主要功能概念:Free monad、cpp_stm_free、view()、traverse()、bind()、to。它使用了Qt C ++和C ++ 11功能。
举个简单的例子,看看如何将任务链接成一个大任务,当应用Amber时,它将改变Amber的世界:
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 ++中的镜头。 (GitHub)(幻灯片(Eng))(Talk(Rus))
这是C ++通用功能镜头的展示。 该工具使用Free monad和一些引人入胜(且有效的)C ++技巧构建而成,以使镜头可组合且外观整洁。 该库仅是演讲的演示,因此它仅提供了一些最重要的组合器,即:270887322212001414849、view()、traverse()、bind(),中缀文字组合器to、over()等。
(请注意,存在“ C ++ Lenses”项目:但这与真正的“ lenses”无关,它与具有C#或Java属性的getter和setter的类属性有关。)
快速示例
Car car1 = {"x555xx", "Ford Focus", 0, {}};
Car car2 = {"y555yy", "Toyota Corolla", 10000, {}};
std::vector cars = {car1, car2};
auto zoomer = traversed() to modelL();
std::function<:string> variator = [](std::string) { return std::string("BMW x6"); };
std::vector result = over(zoomer, cars, variator);
QVERIFY(result.size() == 2);
QVERIFY(result[0].model == "BMW x6");
QVERIFY(result[1].model == "BMW x6");
功能性的“生活”:平行的肉瘤自动机和子宫。 (GitHub)(幻灯片(Eng))(Talk(Rus))
您可能听说过单子。 Monad现在到处都在谈论函数式编程。 这是一个时髦的词。 但是comonads呢? 我介绍了带有引擎盖下的共鸣概念的一维和二维立体自动机。 目的是说明使用std :: future作为Par monad从单流代码移至并行代码是多么容易。 该项目还对这两种方法进行了基准测试和比较。
快速示例
template
UUB fmap(
const func& f,
const UUUUA& uuu)
{
const func 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 };
}
具有纯功能的Free monad库,称为cpp_stm_free。
该库基于Free monad和其他一些功能编程的高级思想。 它的接口类似于Haskell的本地STM库。 事务是一元可组合的,是纯函数式的,并且有很多有用的一元组合,可以使并发模型的设计更加方便和强大。 我已经使用该库实现了Dining Philosophers问题,并且运行良好。 这是哲学家拿叉的一些交易示例:
STML takeFork(const TFork& tFork) {
return withTVar(tFork, [=](const Fork& fork) {
if (fork.state == ForkState::Free) {
return writeTVar(tFork, Fork {fork.name, ForkState:Taken});
}
else {
return retry();
}
});
}
STML takeForks(const TForkPair& forks) {
STML lm = takeFork(forks.left);
STML rm = takeFork(forks.right);
return sequence(lm, rm);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。