您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>C/C++语言编程>

现代C函数式编程

大小:0.7 MB 人气: 2017-09-30 需要积分:1

  导读:本文作者从介绍函数式编程的概念入手,分析了函数式编程的表现形式和特性,最终通过现代C++的新特性以及一些模板云技巧实现了一个非常灵活的pipeline,展示了现代C++实现函数式编程的方法和技巧,同时也体现了现代C++的强大威力和无限可能。

  概述

  函数式编程是一种编程范式,它有下面的一些特征:

  函数是一等公民,可以像数据一样传来传去。高阶函数递归pipeline惰性求值柯里化偏应用函数

  C++98/03中的函数对象,和C++11中的Lambda表达式、std::function和std::bind让C++的函数式编程变得容易。我们可以利用C++11/14里的新特性来实现高阶函数、链式调用、惰性求值和柯理化等函数式编程特性。本文将通过一些典型示例来讲解如何使用现代C++来实现函数式编程。

  高阶函数和pipeline的表现形式

  高阶函数就是参数为函数或返回值为函数的函数,经典的高阶函数就是map、filter、fold和compose函数,比如Scala中高阶函数:

  map

  numbers.map((i: Int) =》 i * 2)

  对列表中的每个元素应用一个函数,返回应用后的元素所组成的列表。

  filter

  numbers.filter((i: Int) =》 i % 2== 0)

  移除任何对传入函数计算结果为false的元素。

  fold

  numbers.fold(0){ (z, i)=》a + i }

  将一个初始值和一个二元函数的结果累加起来。

  compose

  val fComposeG= f _compose g _fComposeG(“x”)

  组合其它函数形成一个新函数f(g(x))。

  上面的例子中,有的是参数为函数,有的是参数和返回值都是函数。高阶函数不仅语义上更加抽象泛化,还能实现“函数是一等公民”,将函数像data一样传来传去或者组合,非常灵活。其中,compose还可以实现惰性求值,compose的返回结果是一个函数,我们可以保存起来,在后面需要的时候调用。

  pipeline把一组函数放到一个数组或是列表中,然后把数据传给这个列表。数据就像一个链条一样顺序地被各个函数所操作,最终得到我们想要的结果。它的设计哲学就是让每个功能就做一件事,并把这件事做到极致,软件或程序的拼装会变得更为简单和直观。

  Scala中的链式调用是这样的:

  s(x)= (1to x)|》 filter(x =》 x % 2 == 0) |》 map (x =》 x * 2)

  用法和Unix Shell的管道操作比较像,|前面的数据或函数作为|后面函数的输入,顺序执行直到最后一个函数。

  这种管道方式的函数调用让逻辑看起来更加清晰明了,也非常灵活,允许你将多个高阶函数自由组合成一个链条,同时还可以保存起来实现惰性求值。现代C++实现这种pipeline也是比较容易的,下面来讲解如何充分借助C++11/14的新特性来实现这些高阶函数和pipeline。

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!