当前位置:首页 » 编程软件 » 函数数编程

函数数编程

发布时间: 2023-08-13 03:16:48

1. 到底什么是函数式编程思维

“简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。”

摘自阮一峰先生的文章:《函数式编程初探》


就我个人理解,函数式编程是介于面向对象与面向过程的,中间性编程方法,具体且更为严谨的介绍,请网络“函数式编程初探”。

函数式编程要求大量的使用函数来代替变量,形成富有逻辑且简洁易用的代码,极端的FP和极端的OOP已经在编程界引起一定反思(FP到最后,就会导致逻辑紊乱,而OOP到最后,会导致维护的艰难)。

在这里附上函数式编程的特点(在“函数式编程初探”中,有部分条目的具体解释):

  1. 第一等公民是函数

  2. 带有闭包的Lambdas/Anonymous函数

  3. 不变性,大部分无态处理,没有状态和变量

  4. 高并发

  5. 无副作用的调用

  6. 通过tail call实现递归的性能优化。

  7. 模式匹配(Haskell, Erlang)

  8. 懒赋值(Miranda, Haskell)

  9. Homoiconicity(类似LISP)

2. js 什么是函数式编程

写一个函数(即方法:function),然后去调用这个方法、比如写个C的helloworld然后调用printf就是函数式(过程化)编程,

补充:javaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

在1995年时,由Netscape公司的Brendan Eich,在网景导航者浏览器上首次设计实现而成。因为Netscape与Sun合作,Netscape管理层希望它外观看起来像Java,因此取名为JavaScript。但实际上它的语法风格与Self及Scheme较为接近。

3. 什么是函数式编程思维

回答都有跑题,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也可以写函数式代码了

但是,这也只是本人积累得来的感悟,绝不敢大肆伸张这就是函数式,我也在不断研究中,如有问题,还望大神指正

4. 函数式编程的特点

其实函数式编程的话你也要学计算机就会知道。

5. scala是函数式编程和面向对象编程结合的语言,这两种编程的特点分别是什么

  • 函数式编程或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)。

    比起命令式编程,函数式编程更加强调程序执行的结果而非执行的过程,倡导利用若干简单的执行单元让计算结果不断渐进,逐层推导复杂的运算,而不是设计一个复杂的执行过程。

  • 面向对象程序设计是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

    目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。 此外,支持者声称面向对象程序设计要比以往的做法更加便于学习,因为它能够让人们更简单地设计并维护程序,使得程序更加便于分析、设计、理解。反对者在某些领域对此予以否认。

    当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发方式。

热点内容
快速指数算法 发布:2025-02-04 20:20:40 浏览:297
python在类中定义函数调用函数 发布:2025-02-04 20:14:47 浏览:594
安卓手机的壁纸是哪个 发布:2025-02-04 20:14:44 浏览:198
java发展前景 发布:2025-02-04 20:10:19 浏览:76
mac登陆密码哪里设置 发布:2025-02-04 19:50:20 浏览:525
手游脚本封号 发布:2025-02-04 19:42:12 浏览:435
玩单机游戏要哪些配置的电脑 发布:2025-02-04 19:17:41 浏览:1003
c语言编程图书 发布:2025-02-04 19:01:52 浏览:898
在哪里开启密码显示 发布:2025-02-04 18:38:30 浏览:791
怎么查询qq密码 发布:2025-02-04 18:20:10 浏览:515