iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 26
0
Software Development

C++ 30天屠龍記系列 第 26

C++ 30天屠龍記(第25天): 一文學懂函數式編程

前言

在第六天,我們了解了什麼是過程式編程,而在今天我將會介紹另一個程式設計方式,也就是函數式編程。函數式編程近年因為React 和 Flutter的興起而大紅大紫。而函數式編程是什麼呢?或者說有什麼特性呢。

函數式有三個概念,分別是

  1. 一等公民和高階函數
  2. 純函數/類似數學函數
  3. 宣告式編程

特性與語法

1. 第一公民特性

函數式編程第一個特性就是當函數式是變數一樣傳遞。例如以下的例子

auto sum = [](auto x, auto y){
		auto sum = x + y;
		return sum;
};
int main(){
	auto sums = sumOf(1,2);
}

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

3. 宣告式編程

宣告式編程是較為抽象的程式碼,描述該在哪做什麼以及資料流程,而且很少用到If,While,for loop等等。你可以很容易猜到他在做什麼,例如下面的程序。

int main(){
	calculate['*'](3.5,2);
	calculate['/'](9.5,2);
}

輸出

7
4.75

4. 高階函數(二)

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

5. 純函數

純函數的意思是,將相同的數值放到函數裡會輸出一樣的結果,就像數學函數一樣。在C++裡,大部分基本函數都是純函數,包括Day 6的函數和今日的所有函數。

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

上一篇
C++ 30天屠龍記(第25天): 用Concept限制template類型
下一篇
C++ 30天屠龍記(第27天):OpenCV大法好(一)
系列文
C++ 30天屠龍記30

尚未有邦友留言

立即登入留言