衡阳派盒市场营销有限公司

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>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%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      盛世国际娱乐场| 太阳城百家乐币| 大发888注册送58网站| 打百家乐官网纯打庄的方法| 大发888老虎机平台| 真人百家乐官网蓝盾赌场娱乐网规则 | 澳门百家乐官网单注下限| 百家乐送现金| 百家乐官网注册开户送彩金| 华泰百家乐的玩法技巧和规则| 百家乐官网赌场规则| 百家乐娱乐网备用网址| 太阳城百家乐官网看牌| 大发888怎么注册不了| 什么事百家乐官网的路单| 南通棋牌游戏金游世界| 百家乐连黑记录| 张北县| 欧凯百家乐的玩法技巧和规则| 百家乐官网赌场赌场平台| 棋牌下载| 百家乐明灯| 百家乐打连技巧| 九州百家乐官网娱乐城| 大发888娱乐城建账号| 网上百家乐官网游戏哪家信誉度最好 | 百家乐官网必胜打| 金乡县| 威尼斯人娱乐城信誉怎么样| 新锦江百家乐官网赌场娱乐网规则| 皇冠网络| 百家乐多少钱| 姚记百家乐官网的玩法技巧和规则 | 澳门百家乐图形| 运城百家乐官网蓝盾| 皇宝国际| 最好百家乐的玩法技巧和规则 | 大发888游戏平台188| 百家乐澳门规矩| 为什么百家乐官网玩家越来越多选择网上百家乐官网 | 大发888在线娱乐合作伙伴|