当前位置: 首页 > news >正文

函数式编程

1.函数式编程定义
简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
2.典型的函数式编程语言
纯函数式编程语言
  • 强静态类型
    • Concurrent Clean
    • Haskell
    • Miranda
  • 弱类型
    • Lazy K

非纯函数式编程语言

  • 强静态类型
    • F#
    • ML
    • OCaml
    • Scala
  • 强动态类型
    • Erlang
    • LISP
    • LOGO
    • Scheme
    • Clojure
    • Mathematica
    • R
  • 弱类型
    • Unlambda

其他函数式编程语言

  • APL
  • XSLT
3.为什么流行
(1) 代码简洁,开发快速
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
Paul Graham在《黑客与画家》一书中写道:同样功能的程序,极端情况下,Lisp代码的长度可能是C代码的二十分之一。
如果程序员每天所写的代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。"当然,这样的对比故意夸大了差异,但是"在一个高度竞争的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。) 接近自然语言,易于理解
函数式编程的自由度很高,可以写出很接近自然语言的代码。
前文曾经将表达式(1 + 2) * 3 - 4,写成函数式语言:
subtract(multiply(add(1,2), 3), 4)
对它进行变形,不难得到另一种写法:
add(1,2).multiply(3).subtract(4)
这基本就是自然语言的表达了。再看下面的代码,大家应该一眼就能明白它的意思吧:
merge([1,2],[3,4]).sort().search("2")
因此,函数式编程的代码更容易理解。
(3) 更方便的代码管理
函数式编程不依赖、也不会改变外界的状态,只要给定输入参数,返回的结果必定相同。因此,每一个函数都可以被看做独立单元,很有利于进行单元测试(unit testing)和除错(debugging),以及模块化组合。
(4)易于"并发编程"
函数式编程不需要考虑"死锁"(deadlock),因为它不修改变量,所以根本不存在"锁"线程的问题。不必担心一个线程的数据,被另一个线程修改,所以可以很放心地把工作分摊到多个线程,部署"并发编程"(concurrency)。
请看下面的代码:
var s1 = Op1();
var s2 = Op2();
var s3 = concat(s1, s2);
由于s1和s2互不干扰,不会修改变量,谁先执行是无所谓的,所以可以放心地增加线程,把它们分配在两个线程上完成。其他类型的语言就做不到这一点,因为s1可能会修改系统状态,而s2可能会用到这些状态,所以必须保证s2在s1之后运行,自然也就不能部署到其他线程上了。
多核CPU是将来的潮流,所以函数式编程的这个特性非常重要。
(5)代码的热升级
函数式编程没有副作用,只要保证接口不变,内部实现是外部无关的。所以,可以在运行状态下直接升级代码,不需要重启,也不需要停机。 Erlang语言早就证明了这一点,它是瑞典爱立信公司为了管理电话系统而开发的,电话系统的升级当然是不能停机的。
 
 
 
 
 

转载于:https://www.cnblogs.com/zhixiazhimeng/p/10467402.html

相关文章:

  • kafka消息可靠性
  • Web 页面性能分析笔记
  • 人工智能会不会变成终结者,这事儿人工智能自己说了不算
  • 二.压缩指令的应用
  • 用一个实际例子理解Docker volume工作原理
  • mysql only_full_group_by
  • Spring基于Scheduler的定时任务模块
  • 2015年高交会又有什么值得期待的黑科技?
  • bootstrap重置项 及响应式版心 row类清除margin
  • 网路通信问题收集
  • 【译】Vue 的小奇技(第八篇):两个鲜有人知的 Vuex 技巧
  • AI 芯片,是金山还是泡沫?
  • 友情链接有什么用
  • Ansible杂记(2)
  • crontab详解
  • 【前端学习】-粗谈选择器
  • Docker: 容器互访的三种方式
  • docker-consul
  • Golang-长连接-状态推送
  • HTTP那些事
  • If…else
  • JavaScript-Array类型
  • javascript从右向左截取指定位数字符的3种方法
  • Java小白进阶笔记(3)-初级面向对象
  • jquery ajax学习笔记
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • nginx 负载服务器优化
  • tweak 支持第三方库
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 欢迎参加第二届中国游戏开发者大会
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 让你的分享飞起来——极光推出社会化分享组件
  • 听说你叫Java(二)–Servlet请求
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • # 安徽锐锋科技IDMS系统简介
  • #Linux(权限管理)
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT(串口助手-界面)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3)STL算法之搜索
  • (9)目标检测_SSD的原理
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net CF下精确的计时器
  • .NET Micro Framework初体验(二)