当前位置:   article > 正文

c语言编程multiplies,C ++中的函数式编程

函数multiprt c语言

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);

}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/818474
推荐阅读
相关标签
  

闽ICP备14008679号