对于函数式编程的新理解
2013-01-16 23:38
169 查看
刚刚在洗澡的时候在想函数式编程的东西,函数式编程不是将函数看成一个对象,函数就是变量,它可以作为参数使用,它既可以作为左值来使用也可以作为右值来使用,函数式编程任何一个函数对于同一个输入,既在函数参数列表中的输入,不会产生多余两种不同的结果,为什么呢?因为函数式编程内部所有的变量不受外部的影响,也就是说,没有其他方法来改变我的内部状态,我的内部状态只有局部变量,没有全局变量,反正就是没有与其他函数共享的变量,所以函数式编程就像数据从函数的入口进入,从函数的出口出去,经过函数加工后,再流入其他的函数。
函数式编程的思想在于递归,但是以前我一直没有理解,为什么是递归,我洗澡时候想了想,应该是因为,如果连变量的值也通过函数来实现的话,那不是得用递归了嘛,比如要实现自然数,如果0表示大O,1表示SO,相当于对0加一,那么SSO不就是2了吗,要求一个n,那么必然得从n-1入手,一直递归下去,在返回n的值。所以对于纯函数编程肯定需要递归来实现。
那么函数式编程又和面向对象编程又有什么区别呢?
可以从闭包和类来比较,闭包相当于封装了私有成员和私有函数,其实和类是一脉相承的,如下:
class A
{
private:
int n;
public:
A(int m)
{
n = m;
}
int add(int m)
{
return n+m;
}
}
类A中有私有成员n,和公有函数add(),类A可以实例化多个对象,不同对象的最大区别不就是私有成员的值不一样吗。
A a(2) 和 A b(3),相当于定义两个函数:
add(m){
2+m
}
add(m){
3+m
}
这个思想其实和函数式编程是一致的。
如下:
python函数式编程:
def f(n):
def add(m):
return m+n
return add
a = f(2) //a不就是相当于上述的A a(2)
b = f(3) //b不就是相当于上述的A b(3)
那么python既支持函数式编程和面向对象编程,如果将两者结合怎么样?还需继续看看
函数式编程的思想在于递归,但是以前我一直没有理解,为什么是递归,我洗澡时候想了想,应该是因为,如果连变量的值也通过函数来实现的话,那不是得用递归了嘛,比如要实现自然数,如果0表示大O,1表示SO,相当于对0加一,那么SSO不就是2了吗,要求一个n,那么必然得从n-1入手,一直递归下去,在返回n的值。所以对于纯函数编程肯定需要递归来实现。
那么函数式编程又和面向对象编程又有什么区别呢?
可以从闭包和类来比较,闭包相当于封装了私有成员和私有函数,其实和类是一脉相承的,如下:
class A
{
private:
int n;
public:
A(int m)
{
n = m;
}
int add(int m)
{
return n+m;
}
}
类A中有私有成员n,和公有函数add(),类A可以实例化多个对象,不同对象的最大区别不就是私有成员的值不一样吗。
A a(2) 和 A b(3),相当于定义两个函数:
add(m){
2+m
}
add(m){
3+m
}
这个思想其实和函数式编程是一致的。
如下:
python函数式编程:
def f(n):
def add(m):
return m+n
return add
a = f(2) //a不就是相当于上述的A a(2)
b = f(3) //b不就是相当于上述的A b(3)
那么python既支持函数式编程和面向对象编程,如果将两者结合怎么样?还需继续看看
相关文章推荐
- 对于android触摸事件模型的一些理解
- 对于STM32别名区的理解
- 对于LabVIEW操作者框架的理解
- 对于Hibernate的openSession方法为什么不是线程安全的源码理解
- 对于断言 ASSERT 的理解
- 对于SG函数的理解
- android webview对shouldOverrideUrlLoading的理解,对于重定向的url
- 对于requirejs AMD模块加载的理解
- 对于C++保护继承方式的一点理解
- [笔记]对于关键字volatile的理解
- 对于hive的一些理解
- 对于session序列化跟session的钝化与活化的粗浅理解
- 对于I2C总线协议的一些理解,未完待续。。。
- 对于为什么要使用接口的个人理解
- 对于interrupt,interrupted 和 isInterrupted的一些理解
- 四,对于变量的理解1——整型变量
- 对于nose框架中class级别的setUp和tearDown函数的一点理解
- 对于拷贝构造函数中参数是引用的理解
- 对于SVN的初步理解
- 对于对象声明和实例化的理解