函数式编程学习总结

Posted serenaxy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程学习总结相关的知识,希望对你有一定的参考价值。

大概了解了一下函数式编程,总的来说可以说,函数式编程就是一种体现函数当成普通变量的思想的编程方法,其中函数指针就是变量,而具体的函数,包括lambda函数就是常量。
学习过程中的代码如下:

  1 #include <iostream>
  2 #include <vector>
  3 #include <map>
  4 #include <functional>
  5 #include <algorithm>
  6 using namespace std;
  7 
  8 //函数式编程的实现:函数指针
  9   //Q:什么是函数指针
 10   //A:函数指针是一种特殊类型的指针变量(指向函数)
 11 
 12   //Q:函数指针是任何函数都可以指向吗
 13   //A:不是,函数指针有类型之分,函数指针的类型会在声明是给出,特定类型的函数指针只能指向特定类型的函数
 14 
 15   //Q:如何声明一个函数指针,或者说不同函数指针的类型怎么区分
 16   //A:eg1:int (*f)(int, int) 其中int(* )(int, int)就是类型, f为函数指针变量
 17   //  eg2:using funType = int (*)(int, int); funType f;
 18 
 19   //Q:为什么没有函数变量
 20   //A:不需要,只需要一个函数就够了,应该工厂只需要一台机器,我们没有必要复制一台功能一模一样的机器
 21 
 22   //总结:函数指针和普通数据类型的指针几乎一致,只是一个指向特定类型的函数(由返回值,参数个数及类型唯一决定), 另一个则指向特定数据类型的变量
 23 /*int main() {
 24     int m_plus(int, int);
 25     //函数指针声明
 26     int(*f)(int, int); //或者:using T = int(*)(int, int); T f;(简单的声明方法) 
 27     //函数指针赋值
 28     f = m_plus;//或者:f = &m_plus(这里是为了可以把函数指针当成一种引用
 29     //函数指针使用
 30     cout << f(1, 2) << endl; //*f不可以(规定吧,没有什么为什么)
 31     system("pause");
 32     return 0;    
 33 }*/
 34 
 35 
 36 
 37 //函数指针的作用
 38 //A1:简化代码
 39 //A2:函数变量化(可以把该指针看成是函数的一种引用), 一个函数指针可以代表该类型下不同的函数, 甚至可以作为函数参数, 使得函数功能具有范式的特点
 40 /*int main() {
 41 #if 0
 42 //例子1:给出3个int型整数a、b、c,当c=0时,求a+b, 当c=1时,求a-b, 当c=2时,求a*b, 当c=3时, 求a/b
 43     int m_plus(int, int);
 44     int m_minus(int, int);
 45     int m_multiply(int, int);
 46     int m_devide(int, int);
 47     int a, b, c;
 48     cin >> a >> b >> c;
 49     using funType = int(*)(int, int);
 50     map<int, funType> m = { {0, &m_plus}, {1, m_minus}, {2, m_multiply}, {3, m_devide} };//加不加引号都可以
 51     cout << m[c](a, b);
 52     system("pause");
 53     return 0;
 54 #else
 55 //例子2:实现f(g(x) = 2(g(x))的效果
 56     int f(int, int(*)(int));
 57     int g1(int);
 58     int g2(int);
 59     int g3(int);
 60     int x;
 61     cout << "输入x:";
 62     cin >> x;
 63     cout << "f(2*x) = " << f(x, g1) << endl;
 64     cout << "f(2*x^2) = " << f(x, g2) << endl;
 65     cout << "f(2*x^3) = " << f(x, g3) << endl;
 66     system("pause");
 67     return 0;
 68 #endif
 69 }*/
 70 
 71 
 72 
 73 
 74 //lambda表达式
 75 //Q:lambda表达式有什么用
 76 //A1:实现了函数的数值化,可以把一个lambda表达式看成一个数值(该表达式会返回一个函数指针)
 77 //A2:与函数指针配合实现了数据类型定义变量的效果(int x = 0)
 78 //A3:返回一个函数
 79 /*int main() {
 80 #define SEL 5
 81 #if (SEL == 1)
 82     //例子1:用lambda表达式实现a%b函数
 83     auto f = [](int a, int b) { return a % b; };
 84     int a, b;
 85     cin >> a >> b; 
 86     cout << f(a, b);
 87     system("pause");
 88     return 0;
 89 #elif (SEL == 2)
 90     //例子2:给出3个int型整数a、b、c,当c=0时,求a+b, 当c=1时,求a-b, 当c=2时,求a*b, 当c=3时, 求a/b
 91     map<int, int(*)(int, int)> m = {
 92         {0,[](int a, int b) {return a + b;}},
 93         {1,[](int a, int b) {return a - b;}},
 94         {2,[](int a, int b) {return a * b;}},
 95         { 3,[](int a, int b) {return a / b;}}
 96     };
 97     int a, b, c;
 98     cin >> a >> b >> c;
 99     cout << m[c](a, b);
100     system("pause");
101 #elif(SEL == 3)
102     //例子3:假设不使用map,仍使用if-else的语句,你能通过传递lambda表达式作函数参数的形式,在main函数外,仅实现一个函数compute来实现加减乘除求余这5种运算吗?
103     int compute(int(*)(int, int), int, int);
104     int a, b, c;
105     cin >> a >> b >> c;
106     if (c == 0)
107         cout << compute([](int a, int b) {return a + b; }, a, b);
108     else if (c == 1)
109         cout << compute([](int a, int b) {return a - b; }, a, b);
110     else if (c == 2)
111         cout << compute([](int a, int b) {return a * b;}, a, b);
112     else
113         cout << compute([](int a, int b) {return a / b;}, a, b);
114     system("pause");
115     return 0;
116 #elif(SEL == 4)
117     //例子4:返回一个函数
118     function<int(int, int)>g();
119     auto i = g();
120     cout << i(1, 2);
121     system("pause");
122     return 0;
123 #endif
124 }*/
125 
126 function<int(int, int)>g() {
127     return [](int a, int b) {return a + b; };
128 }
129 
130 //函数指针的更好替代:function标准库类型
131 /*int main() {
132     function<int(int, int)> f = [](int a, int b) {return a + b;};
133     cout << f(1, 2) << endl;
134     system("pause");
135     return 0;
136 }*/
137 
138 //functional库中的其他函数(function好比变量, 其他函数好比常量)
139 /*int main() {
140 #define SEL 3
141 #if (SEL == 1)
142     //例子1:
143     auto i = plus<int>();
144     cout << i(1, 2) << endl;
145     cout << minus<int>()(2, 1) << endl;
146     cout << divides<double>()(2.5, 2) << endl;
147     cout << modulus<int>() (8, 3) << endl;
148     cout << negate<int>()(3) << endl;
149     cout << equal_to<int>()(2, 2) << endl;
150     cout << not_equal_to<int>()(2, 3) << endl;
151     cout << greater<int>()(3, 2) << endl;
152     cout << greater_equal<int>()(3, 2) << endl;
153     cout << less<double>()(3.2, 4.5) << endl;
154     cout << less_equal<int>()(3, 2) << endl;
155     cout << logical_and<int>()(3, 2) << endl;
156     cout << logical_or<int>()(3, 2) << endl;
157     cout << logical_not<int>()(3) << endl;
158     system("pause");
159     return 0;
160 #elif (SEL == 2)
161     //例子2:
162     map<int, function<int(int, int)>> m = {
163         {0, plus<int>()}, {1, minus<int>()},
164         {2, multiplies<int>()}, {3, divides<int>()}
165     };
166     int a, b, c;
167     cin >> a >> b >> c;
168     cout << m[c](a, b);
169     system("pause");
170     return 0;
171 #elif (SEL == 3)
172     //例子3:排序的应用
173     vector<int> v = { 2, 5, 4, 1, 3 };
174     sort(v.begin(), v.end(), greater<int>());
175     for (int i : v)
176         cout << i << " ";
177     system("pause");
178     return 0;
179 #endif
180 }*/
181 
182 //练习
183 double compute1(double a, double b, function<double(double)> f) {
184     return (f(b) + f(a)) * (b - a) / 2;
185 }
186 double fun1(double k, double m, double x) {  //1次函数
187     return k * x + m;
188 }
189 function<double(double)>fun1ForApplication(int k, int m) {  //返回或者产生具体的一次函数(k, m确定)
190     return [k, m](double x) {return fun1(k, m, x);};//捕获,相当于把
191 }
192 int main() {
193 #define SEL 2
194 #if (SEL == 1)
195     //练习1:求一次函数的积分
196     cout << "2x + 10 在 (3, 7) 范围内的积分为:";
197     cout << compute1(3, 7, [](double x) { return 2 * x + 10; });
198 #elif (SEL == 2)
199     //练习2:用科里化的方式对上述练习进行改进(捕获)
200     auto i = fun1ForApplication(2, 10);  //i 为 2 * x + 10 的函数
201     cout << compute1(3, 7, i) << endl;
202 #endif
203     system("pause");
204     return 0;
205 }
206 
207 int m_plus(int a, int b) {
208     return a + b;
209 }
210 int m_minus(int a, int b) {
211     return a - b;
212 }
213 int m_multiply(int a, int b) {
214     return a * b;
215 }
216 int m_devide(int a, int b) {
217     return a / b;
218 }
219 int f(int x, int(*g)(int)) {
220     return 2 * g(x);
221 }
222 int g1(int x) {
223     return x;
224 }
225 int g2(int x) {
226     return x * x;
227 }
228 int g3(int x) {
229     return x * x * x;
230 }
231 int compute(int(*f)(int, int), int a, int b) { //f为二元运算函数
232     return f(a, b);
233 }

 

以上是关于函数式编程学习总结的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程

FCC 成都社区活动总结丨走近函数式编程

函数式编程简介

函数式编程/命令式编程

《On Java 8》中文版 第十三章 函数式编程

在你身边你左右 --函数式编程别烦恼