码迷,mamicode.com
首页 > 编程语言 > 详细

函数式语言

时间:2019-02-28 14:55:56      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:sid   不难   应该   赋值   var   science   设计   deb   不能   

函数式语言主要是一类程序设计性语言,是一种非冯诺伊曼式的程序设计语言。

 概念:

 函数式语言主要成分是原始函数,定义函数,和函数型。这种语言具有较强的组织数据结构的能力。可以把函数作为参数,也可以单一的数据结构进行处理。这种定义的函数成为高阶函数。即程序就是函数。从更本上改变了冯.诺伊曼

式语言的逐次工作方式。

 函数式编程:

函数式编程就是一种抽象程度很高的编程范式,纯粹的函数式编程语言编写的函数没有变量,因此,任意一个函数,只要输入是确定的,输出就是确定的,这种纯函数我们称之为没有副作用。而允许使用变量的程序设计语言,由于函数内部的变量状态不确定,

同样的输入,可能得到不同的输出,因此,这种函数是有副作用的

 函数式编程主要特点:

   1 函数的抽象性:

       函数与其他数据类型一样,可以赋值给其他参数,也可以作为变量传入函数当中来。或者作为别的函数的返回值。

  2 函数只用表达式,没有语句:

     “表达式”是一个单独的运算过程总是有返回值;"语句"(statement)是执行某种操作,没有返回值。函数式编程要求,只使用表达式,不使用语句。也就是说,每一步都是单纯的运算,而且都有返回值。

  3 没有"副作用”:

    所谓"副作用"(side effect),指的是函数内部与外部互动(最典型的情况,就是修改全局变量的值),产生运算以外的其他结果。

    函数式编程强调没有"副作用",意味着函数要保持独立,所有功能就是返回一个新的值,没有其他行为,尤其是不得修改外部变量的值。

  4 不修改状态:
     函数式编程只是返回新的值,不修改系统变量。

  5 引用透明

      引用透明(Referential transparency),指的是函数的运行不依赖于外部变量或"状态",只依赖于输入的参数,任何时候只要参数相同,引用函数所得到的返回值总是相同的。

函数式编程的流行原因:

  1. 代码简洁,开发快速

      函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。

     Paul Graham在《黑客与画家》一书中写道:同样功能的程序,极端情况下,Lisp代码的长度可能是C代码的二十分之一。 

      如果程序员每天所写的代码行数基本相同,这就意味着,"C语言需要一年时间完成开发某个功能,Lisp语言只需要不到三星期。反过来说,如果某个新功能,Lisp语言完成开发需要三个月,C语言需要写五年。"当然,这样的对比故意夸大了差异,

      但是"在一个高度竞  争   的市场中,即使开发速度只相差两三倍,也足以使得你永远处在落后的位置。"

  2. 接近自然语言,易于理解

      函数式编程的自由度很高,可以写出很接近自然语言的代码。

      前文曾经将表达式(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语言早就证明了这一点,它是瑞典爱立信公司为了管理电话系统而开发的,电话系统的升级当然是不能停机的。

 

 

 

 

 

函数式语言

标签:sid   不难   应该   赋值   var   science   设计   deb   不能   

原文地址:https://www.cnblogs.com/taue997/p/10449774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!