c语言编程multiplies,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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值