c函数式编程
函数式编程相对应的是命令式编程
比方说你要定义一个方法
命令式编程如下:
def func1():
而同样功能的函数式编程如下:
func1 = lambda :
B. 式编程,命令式编程()和函数式编程的区别
编程语言主要有四种类型
声明式编程:专注于”做什么”而不是”如何去做”。在更高层面写代码,更关心的是目标,而不是底层算法实现的过程。
ex: css, 正则表达式,sql 语句,html, xml…命令式编程(过程式编程) : 专注于”如何去做”,这样不管”做什么”,都会按照你的命令去做。解决某一问题的具体算法实现。
函数式编程:把运算过程尽量写成一系列嵌套的函数调用。
函数式编程强调没有”副作用”,意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。
所谓”副作用”(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。
C. 求科普什么是函数式编程语言
实际上,函数式编程没有一个严格的官方定义。严格上来讲,函数式编程中的“函数”,并不是指我们编程语言中的“函数”概念,而是指数学“函数”或者“表达式”(例如:y=f(x))。不过,在编程实现的时候,对于数学“函数”或“表达式”,我们一般习惯性地将它们设计成函数。所以,如果不深究的话,函数式编程中的“函数”也可以理解为编程语言中的“函数”。
D. 函数式编程有哪些优点
对于函数式编程,你可以学习一下haskell。
重点的优点是语法灵活(在高阶函数里,你可以把函数当做参数传,类似于C的函数指针),语法简洁,类型和数据安全,多态支持性等等。
E. 到底什么是函数式编程思维
“简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。”
摘自阮一峰先生的文章:《函数式编程初探》
就我个人理解,函数式编程是介于面向对象与面向过程的,中间性编程方法,具体且更为严谨的介绍,请网络“函数式编程初探”。
函数式编程要求大量的使用函数来代替变量,形成富有逻辑且简洁易用的代码,极端的FP和极端的OOP已经在编程界引起一定反思(FP到最后,就会导致逻辑紊乱,而OOP到最后,会导致维护的艰难)。
在这里附上函数式编程的特点(在“函数式编程初探”中,有部分条目的具体解释):
第一等公民是函数
带有闭包的Lambdas/Anonymous函数
不变性,大部分无态处理,没有状态和变量
高并发
无副作用的调用
通过tail call实现递归的性能优化。
模式匹配(Haskell, Erlang)
懒赋值(Miranda, Haskell)
Homoiconicity(类似LISP)
F. 什么是函数式编程
在维基网络中,已经对函数式编程有了很详细的介绍。
那我们就来摘取一下Wiki上对Functional Programming的定义:
In
computer science, functional programming is a programming paradigm that
treats computation as the evaluation of mathematical functions and
avoids state and mutable data.
简单地翻译一下,也就是说函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念。
G. 什么是函数式编程思维
回答都有跑题,show概念之嫌,题主问的是函数式思维,这个问题我一直在思考,毕竟是方法论,能力有限,只能从切身实践告诉你
1.表达式化
在
最初的时候,需要转变观念,去可变量,去循环,把命令式改成表达式,注意,这只是把你丢在荒山野岭让你感受一下,离开熟悉的环境,地球依然在转,但是有个
重点,那就是一切都是表达式; 为什么是表达式呢?这个问题就像为什么鱼在水里?
因为函数式建立在lambda演算之上而非图灵机,只不过两者被证明等价,所以你可以在你的机器上跑全是表达式的代码,就如有人证明天空适合鱼生存,所以
鱼可以在天上游
当你接受了鱼可以在天上游之后,就该上正餐了
1.5 数据与行为分离
这也是和面向对象不一致的地方,面向对象强调数据与行为绑定,但函数式不是,确切的说函数式 函数与数据等价,所以你才可以将函数当参数与返回值,你在设计时,切勿让数据自己长腿能跑,其次,行为必须消除副作用,不可以偷偷把数据改了,习惯第一条后,应该不会的
2.高阶逻辑
用
了函数式,就不要在想循环,赋值这些低阶逻辑了,而应该更高阶的思考问题,这比转化表达式更难,函数式又叫声明式,也就是你要做什么,只要说一下就行,而
非写个遍历,做个状态判断,用函数式你不需要考虑这些,你不知道函数式的列表是怎么遍历的,中间向两边?
从后往前?这也是为何函数式适合并发的原因之一,你想知道列表中大于3的数有多少,只要,list.count(_ > 3)
而不是写循环,你可以直接写你的业务,不要拘泥于细节,有点像sql, 你需要什么告诉电脑就行,你或许会问,count foreach filter
这些函数怎么来的? 因为有了他们你才不需要写循环,他们把你留在高阶逻辑中,这个问题的答案请看下面
3.组合子逻辑 或又叫 自底向上的设计
函
数式和OO是反的,面向对象是自顶向下的设计,函数式是自底向上的设计,也就是先定义最基本的操作,然后不断组合,不断堆积以满足你的所有需要,如sql
定义了select, from, where...这几个组合子,来满足你的查询需求,同理函数式语言会提供foreach,
map等组合子(操作)来满足你的需求,所以你必须自下而上的设计你的代码结构,并且满足你的需求,当你只用组合子写代码时,你会发现你写的全是高阶逻辑
如
果这些已有组合子满足不了你,你就得自己写,foreach不行,你就自己写递归,我告诉你,递归背后也是组合子,这里一些'大神'应该不知道,在图灵机
里,递归就是方法不断调用自己没什么好说的,但是在lambda演算中,匿名函数是没法调用自己的,所以递归是用Y组合子(又叫不动点组合子)把递归函数
自己求解出来再调用的,这才可以实现递归,并与图灵机的循环等价,有点跑题了,总之要想顺手的写函数式,最好用面向组合子的设计,注意,不是必须,组合子
演算和lambda演算可以相互转化,也就是,你完全可以写一堆杂乱的表达式,但没有组合子逻辑来得清爽,Haskell大规模使用monad这个特殊组
合子,始其变得统一整洁
好了,总结一下
函数式思维,其实就是组合子逻辑,用简单的几个函数组合来构建复杂逻辑,始终以高阶的角度去表达问题,而非依赖副作用。
知道这点,你用java也可以写函数式代码了
但是,这也只是本人积累得来的感悟,绝不敢大肆伸张这就是函数式,我也在不断研究中,如有问题,还望大神指正
H. 函数式编程的特点
其实函数式编程的话你也要学计算机就会知道。
I. 函数式编程有什么弊端
我接触过Haskell、Clojure和其他语言,也做过PL的“研究”。可以浅谈一下:
函数的复杂度
分析Haskell程序的时间和空间复杂度是很麻烦的。首先编写Haskell程序往往是很多“重用”内置/自定义数据结构,以实现数据持久性(或“不变性”)可以增加空间和时间消耗(实现策略有很多,但采取临时解决方案不影响永久治愈),优点是控制副作用。然后,函数组合和高阶函数可能代价昂贵,可以生成额外的中间数据。其优点是抽象能力强,模块化是有益的。最后,惰性评价使过程评价模型复杂,滥用可导致效率的降低。功能语言的分析工具也较少。
但是这些提供了细粒度的模块化,程序员需要更多的“设计”。“使用函数式编程的程序员必须努力确保程序使用更小、更简单、更通用的模块,”Huges说。这是一个挑战。
而且,模块之间的交互也是一个问题。