1、What is functional language?

函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言。函数式语言主要成分是原始函数、定义函数和函数型。这种语言具有较强的组织数据结构的能力,可以把某一数据结构(如数组)作为单一值处理;可以把函数作为参数,其结果也可为函数,这种定义的函数称为高阶函数,程序就是函数,程序作用在结构型数据上,产生结构型结果,从根本上改变了冯·诺伊曼式语言的“逐词”工作方式。

2、Include:

纯函数式编程语言:

强静态类型:Concurrent Clean、Hask、Miranda

弱类型:Lazy K

非纯函数式编程语言:

强静态类型:F#、ML、OCaml、Scala

强动态类型:Erlang、LISP、LOGO、Scheme、Clojure、Mathematica、R

弱类型:Unlambda

其他函数式编程语言:

APL、XSLT

3、Why popular?

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

(2)并行。在函数式编程中,程序员无需对程序修改,程序就可以并发运行。程序运行期间,不会产生死锁现象。原因是通过函数式编程所得到的程序,在程序中不会出现某一数据被同时修改两次及以上的情况,同样的,两个不同的线程就更不用说了。由于函数式编程有这样的优点,导致了程序员完全不用花费精力去考虑增加某个线程带来的并发问题。
在函数编程语言中,编译器会分析代码,辨认出潜在耗时的创建字符串s1和s2的函数,然后将他们并行的运行。这样的做法,是程序员在使用普通的命令式程序语言时不可能做到的。而使用函数式程序语言可以自动的找出那些可以并发执行的函数。
(3)单元测试。在函数式编程中,由于程序中的每一个符号都是final后的,所以这样的函数不会产生副作用。这就导致了在某个地方产生修改,同时不会有函数修改过在自身范围之外的变量或者状态被另外的函数所使用。这就导致了函数的返回结果只是返回值。只有函数自身的参数才会影响函数的返回值,所以在编程的时候,对程序中的每个函数而言,程序员只需在控制它们的参数,而不用在意函数自己点顺序以及函数外部变量和状态就能正确的编程。与函数式编程相比,命令式编程就没有这样的优势了,在检查函数的返回值的同时程序员还必须检查函数是否影响到了函数的外部状态和变量。
(4)没有额外作用。副作用是指的是函数内部与外部互动。比如,函数在自身内部可以对函数以外的其他变量进行修改,这样就会产生其他结果。在函数式编程中,想要达到这样的目的就必须让函数自身要保持独立。在函数式程序语言中,所有的功能的结果就是一个返回值,不存在其他的行为,包括对外部变量的修改。
(5)不修改状态。在函数式编程中,程序语言在使用中是会不修改变量的,它的一个特性可以使得函数式编程语言区别于其他的程序语言。在其他类型的语言中,变量是用来保存状态的。由于函数式编程不修改变量,导致了这些状态不能存在于变量中。那么,函数式编程语言保存状态的方法是使用参数来保存,递归方法是最好的例子。由于采用了递归方法,函数式编程语言在运行速度上相对于其他语言较慢,所以,速度不够快是函数式编程语言长期不能广泛使用的主要原因。
(6)引用透明。在函数式编程中,引用透明指的是运行函数的时候,函数的没一个步骤都不会不牵连到函数的外部变量或状态,而是只依赖于函数输入的参数,相同的参数输入总会得到相同的函数返回值。而在其他类型的语言中,函数的返回值不仅仅与函数的参数传入有关,也与当前的系统状态有关。在不同的系统状态的情况下,函数的返回值不同。
(7)代码部署热。在以前,假如想在Windows上安装更新,安装之后重启计算机是必须进行的步骤,可能还不只一次的重启。即使是仅仅安装了一个小的软件也不能免于重启的步骤。一些特殊的系统,比如电信系统,这样的系统必须保证任何时间都在运行。因为如果在系统更新时紧急拨号失效,就可能造成很大的损失。最理想的情况是在完全不停止系统任何组件的情况下,达到更新相关的代码的目的。这样的想法在命令式编程中是不可能的。对函数式的程序,所有的状态即传递给函数的参数都被保存在了堆栈上,这使的热部署轻而易举。实际上,所有我们需要做的就是对工作中的代码和新版本的代码做一个差异比较,然后部署新代码。其他的工作将由一个语言工具自动完成。
函数式编程语言相对于其他编程语言具有以下意义:首先,函数式编程语言的代码十分简单,加快了开发的速度。并且由于在使用函数式编程语言时,程序员会大量使用到函数,从而减少了重复的代码,因而程序比较短。其次,函数式编程语言更加接近我们使用的自然语言,程序员在学习和使用它的时候更加快捷容易。函数式编程语言的自由度很高,十分接近自然语言写出的代码。另外,函数式编程语言的代码管理更加方便。函数式编程不会对外部产生依赖,也不会修改外界的状态。程序员只需把指定的参数给函数,相同的参数其返回的结果必定是相同的。另外,函数式编程语言还支持并发编程,这就使得程序员在进行函数式编程时完全不用考虑死锁的问题,因为它根本就不修改变量,所以就不存在锁线程的问题。最后,函数式编程语言的代码支持代码热升级。

转载于:https://www.cnblogs.com/schhz208/p/10467991.html

Functional Language相关推荐

  1. 函数式语言(function language)

    function language 一.函数式语言(function language) 函数式语言(functional language)一类程序设计语言,是一种非冯·诺伊曼式的程序设计语言.函数 ...

  2. gitter 卸载_最佳Gitter频道:Scala

    gitter 卸载 by Gitter 通过吉特 最佳Gitter频道:Scala (Best Gitter channels on: Scala) Scala is an object-orient ...

  3. javascript优缺点_为什么要在JavaScript中使用静态类型? 优缺点

    javascript优缺点 by Preethi Kasireddy 通过Preethi Kasireddy 为什么要在JavaScript中使用静态类型? 优缺点 (Why use static t ...

  4. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路...

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  5. 函数式编程语言python-函数式编程语言

    最近一段时间总是听到或者看到有人谈论"函数式编程",第一次接触是在大概半年前的一次沙龙中,当时听人讲的时候,心想这有什么难理解的,函数式编程,函数嘛,那就是C呀,C++放在首位的是 ...

  6. 计算机毕业生求职之路

    2019独角兽企业重金招聘Python工程师标准>>> 一个应届计算机毕业生的2012求职之路 1.简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的 ...

  7. 自2018年以来我不知道的事情-Dan Abramov

    原文地址哈:https://overreacted.io/things-i-dont-know-as-of-2018/ 人们常常假设我知道的知识远比实际知识道的多.我不抱怨这个错误的想法.(拥有些许成 ...

  8. A Complete List of .NET Open Source Developer Projects

    http://scottge.net/2015/07/08/a-complete-list-of-net-open-source-developer-projects/?utm_source=tuic ...

  9. 2012年CS毕业生

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

最新文章

  1. 前端交易型系统设计原则
  2. Java数据结构和算法( 二 ) ## 数组
  3. Oracle在Linux平台“静默”安装(二)
  4. WP7 应用数据存储Tombstoning(墓碑化)篇
  5. 如何调试 Android 上 HTTP(S) 流量
  6. patience counts
  7. 答应我,调试Python代码,不要再用Print了!
  8. RobotFramework自动化框架—数据驱动测试
  9. 【资料下载区】【iCore、 iCore2相关资料】更新日期2017/1/11
  10. A Web Module That Uses JavaServer Faces Technology: The hello2 Example
  11. Java中的低GC:使用原语而不是包装器
  12. vue 父组件获取接口值传到子组件_vue父组件异步获取数据传给子组件的方法
  13. 微信小程序云开发教程-微信小程序的JS高级-页面间数据传递
  14. java利用openoffice转换doc、docx、txt、pptx、xlxs为PDF格式文件
  15. Atitit 图像处理--图像分类 模式识别 肤色检测识别原理 与attilax的实践总结
  16. Linux下原生异步IO接口Libaio的用法
  17. 学会使用box-sizing布局
  18. 了解如何在Windows中安全删除文件
  19. python打印hello_Python第一行代码——打印hello world
  20. 深度学习之GPU显存与利用率 浅析小结

热门文章

  1. linux的Nginx安装、默认虚拟主机、用户认证、域名重定向配置介绍
  2. 亚信安全中标民生银行防病毒项目 为“互联网+金融”革新防护能力
  3. openSUSE install albertlauncher from source files
  4. 【转】Android Studio系列教程一--下载与安装
  5. CNN卷积层图像和矩阵转换函数
  6. 【正一专栏】梅西、内马尔分开明天会更好
  7. 手机型号大全资料_电子元器件知识资料大全
  8. fetch 发送 AJAX请求
  9. 计算属性|| 计算属性与方法的区别:计算属性是基于它们的依赖进行缓存的 ;方法不存在缓存||侦听器
  10. C#-异步Ping检查网络通断