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

从具体的编程语言实现来来看,数据的不变性,一等函数,高等函数,lambda运算,闭包,惰性求值。另外函数式编程大量使用递归,但是递归效率很低,因此出现了尾递归来优化。除了这些通用的特性以外各个编程语言还实现了自己独有的函数式编程特性。下面就先从通用的开始介绍,然后在介绍各个编程语言独有的特性。

数据的不变性:数据不变性指的是一个编程语言中的数据类型一旦分配空间并初始化,那么他的内容就不可以再改变。由于这儿讨论的是都是面向对象的编程对象,而面向对象的编程语言中可以有两种类型的”变“:引用改变和对象属性的改变。引用改变非常简单,Java的final和C++的const都可以实现。因此这儿代表的是对象属性的不可变,在函数式编程里面强调避免使用程序状态以及易变对象。因为这样就不用考虑对象共享的问题了,一个对象可以任意共享,因为知道这个对象会保持原样。

Scala中的不变:Scala中提供了var和val用来控制引用的不变性,var表示变量,val表示不变。注意他们就相当于Java中的final关键字,并没有保证底层对象的不可变。例如:

import scala.collection.mutable.Map
val treasureMap = Map[Int, String]()
treasureMap += (1 ->"Go toisland.")
treasureMap += (2 ->"Find big X onground.")
treasureMap += (3 ->"Dig.")

另外注意:如果对象的每一个属性都用val声明的话,那么就可以实现对象内容的不变。

Scala的类库中提供了两种集合类型:一种是不可变的。在scala.collection.immutable包中,这是默认的,也就是说如果上面的代码没有显式导入可变的Map类那么创建的Map就是不可变的。第二中是可变的集合类型,在scala.collection.mutable。他们的特质,英文trait(类似于Java中的接口)在scala.collection中。

Ruby中的不变:Ruby并没有提供引用层次的不可变,但是Ruby的freeze方法就是把对象冻结,这样任何改变都会抛出异常,我本人觉得这种方法较灵活但是也容易引起不必要的麻烦,因为我不知道这个对象为什么突然就不能改变了,追踪起来也比较麻烦。例如,

Array = [“ssj”,20,”ssh”,12]
Array<<”ssjssh”
Array.freeze =
Array<<”sshssj”//RuntimeError:can’t modify frozen Array

另外:Erlang使用的也是引用的模型,它的引用和值都不可变。因此可以认为Erlang的变量完全不可变。

Ruby使用冻结的方法可以得到不变的值,但是没有办法来阻止引用不可变。

Scala的引用不可变非常容易实现,但是值不变需要类的封装来实现,这样它的机制比较难以实现,细节也较多。

相比较而言,Erlang不变量最简单最易用,Ruby的使用比较Scala来的简单。

[置顶] Ruby,Scala和JavaScript中的函数式编程(一)的更多相关文章

  1. 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程

    本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...

  2. (数据科学学习手札48)Scala中的函数式编程

    一.简介 Scala作为一门函数式编程与面向对象完美结合的语言,函数式编程部分也有其独到之处,本文就将针对Scala中关于函数式编程的一些常用基本内容进行介绍: 二.在Scala中定义函数 2.1 定 ...

  3. C#中的函数式编程:序言(一)

    学了那么久的函数式编程语言,一直想写一些相关的文章.经过一段时间的考虑,我决定开这个坑. 至于为什么选择C#,在我看来,编程语言分三类:一类是难以进行函数式编程的语言,这类语言包括Java6.C语言等 ...

  4. 可爱的 Python : Python中的函数式编程,第三部分

    英文原文:Charming Python: Functional programming in Python, Part 3,翻译:开源中国 摘要:  作者David Mertz在其文章<可爱的 ...

  5. Apache Beam中的函数式编程理念

    不多说,直接上干货! Apache Beam中的函数式编程理念 Apache Beam的编程范式借鉴了函数式编程的概念,从工程和实现角度向命令式妥协. 编程的领域里有三大流派:函数式.命令式.逻辑式. ...

  6. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

    C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

  7. C#中面向对象编程中的函数式编程详解

    介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...

  8. Java 中的函数式编程(Functional Programming):Lambda 初识

    Java 8 发布带来的一个主要特性就是对函数式编程的支持. 而 Lambda 表达式就是一个新的并且很重要的一个概念. 它提供了一个简单并且很简洁的编码方式. 首先从几个简单的 Lambda 表达式 ...

  9. 深入理解javascript中实现面向对象编程方法

    介绍Javascript中面向对象编程思想之前,需要对以下几个概念有了解: 1. 浅拷贝和深拷贝:程序在运行过程中使用的变量有在栈上的变量和在堆上的变量,在对象或者变量的赋值操作过程中,大多数情况先是 ...

随机推荐

  1. asp.net操作cookie类

    using System; using System.Collections.Generic; using System.Linq; using System.Web; /// <summary ...

  2. iOS开发UI篇——九宫格坐标计算

    一.要求 完成下面的布局 二.分析 寻找左边的规律,每一个uiview的x坐标和y坐标. 三.实现思路 (1)明确每一块用得是什么view (2)明确每个view之间的父子关系,每个视图都只有一个父视 ...

  3. ASP.NET菜鸟之路之Response小例子

    背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. Response.Write Redirect ...

  4. angular.js学习手册(二)

    如何使用angularjs? 各个 angular.js 版本下载: https://github.com/angular/angular.js/releases 下载完之后,在你需要使用angula ...

  5. php 时间戳 总结 今日,昨日,上周,本周,最近三个月,上季,本季,去年,最近七天,今年,最近三十天

    if($time=="今日"){ $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y')); $endToday=mktime ...

  6. ASP.NET MVC 缓存使用示例

    应该说,缓存的设计是一门较为复杂的学问,主要考虑的问题包括:要不要缓存?要缓存哪些数据?要缓存多少数据?要缓存多久?如何更新缓存(手动还是自 动)?将缓存放在哪里?本文将以较为通俗易懂的方式,来看一看 ...

  7. kill tomcat process in window

    1.通过命令netstat -ano | findstr 8080找到tomcat所占用的process,如下图   2.执行ntsd -c q -p 7944 kill刚刚找到的process,然后 ...

  8. JLRoutes--处理复杂的URL schemes-备

    关键字:URL,URL schemes,Parse  代码类库:网络(Networking) GitHub链接:https://github.com/joeldev/JLRoutes   JLRout ...

  9. 分布式配置管理平台 - Disconf介绍

    原博客地址:http://blog.csdn.net/zhu_tianwei/article/details/47984545 Disconf专注于各种分布式系统配置管理的通用组件/通用平台,提供统一 ...

  10. Solr4.8.0源码分析(11)之Lucene的索引文件(4)

    Solr4.8.0源码分析(11)之Lucene的索引文件(4) 1. .dvd和.dvm文件 .dvm是存放了DocValue域的元数据,比如DocValue偏移量. .dvd则存放了DocValu ...