在第六天,我們了解了什麼是過程式編程,而在今天我將會介紹另一個程式設計方式,也就是函數式編程。函數式編程近年因為React 和 Flutter的興起而大紅大紫。而函數式編程是什麼呢?或者說有什麼特性呢。
函數式有三個概念,分別是
函數式編程第一個特性就是當函數式是變數一樣傳遞。例如以下的例子
auto sum = [](auto x, auto y){
auto sum = x + y;
return sum;
};
int main(){
auto sums = sumOf(1,2);
}
可以當函數式是參數傳入到另一個函數式,甚至是Vector/Map等等。改動Day 6的函數式為例子。
#include <unordered_map>
#include <functional>
using namespace std;
auto difference = [](auto x, auto y){ return x-y; };
auto product = [](auto x, auto y){ return x * y; };
auto quotient = [](auto x, auto y){ return x/y; };
auto sum = [](auto x, auto y){ return x + y; };
unordered_map<char, function<double(double,double)>> calculate = {
{'+',sum},
{'-',difference},
{'*',product},
{'/',quotient}
};
宣告式編程是較為抽象的程式碼,描述該在哪做什麼以及資料流程,而且很少用到If,While,for loop等等。你可以很容易猜到他在做什麼,例如下面的程序。
int main(){
calculate['*'](3.5,2);
calculate['/'](9.5,2);
}
輸出
7
4.75
Lambda也擁有高階函數的第二個特性,就是能自己返回函數了
using namespace std;
auto chooseSign = [](char sign){ return calculate[sign]; };
auto equation = [](auto x, auto y,char sign, auto z){
auto evaluate = chooseSign(sign);
for(auto i = 0;i<2000;i++){
if(evaluate(x,y) == z) return x;
else if(evaluate(x,y) == z) return -x;
}
return -1;
};
純函數的意思是,將相同的數值放到函數裡會輸出一樣的結果,就像數學函數一樣。在C++裡,大部分基本函數都是純函數,包括Day 6的函數和今日的所有函數。
舉個例子
#include<tuple>
auto return3Ints = [](auto a, auto b, auto c) -> tuple <int, int, int> {
return make_tuple(a, b, c);
};
int main(){
auto [a,c,d] = return3Ints(1,7,3);
}