`
rysh0818
  • 浏览: 21888 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

对函数式编程简单理解

 
阅读更多

函数式编程是一种编程范式,和面向对象的编程方式一样,是一种编程思想。函数式编程现在相当的火爆,最近也在关注这方面的思想。

对于面向对象编程主要有三点特性:封装,多态,继承

封装就是把对象的属性和对象的行为封装到一个定义的类里面

多态就是同一个对象可以表现为多种具体的形式

继承就是子类可以继承父类的属性和行为

面向对象编程的思想是把所有的事物都当做对象来看待,任何事物皆对象。我们在学习面向对象的编程的时候,最喜欢举的例子就是形状->长方形->正方形 ,对于这种例子,面向对象的编程的确是非常合适的。对于大多数的自然界事物,都是可以抽象出来一个具体的对象,在具体化对象的属性和行为。这种编程思想和人类的认知具体事物的方式非常接近,所以面向对象的方法一直流行了20几年。

但是在某些情况下,并不是世界上所有的事物都适合用对象来表示,最常见的就是数学中的科学计算和逻辑运算

我们举一个简单的例子,我们定义一个函数 f(x) = x*x + 2*x - 100 ,我们需要对f(1)到f(n)的结果进行求和,看看如何实现这一段逻辑

用面向对象的方式实现

面向对象的方式需要抽象出来一个对象来表现现实世界的事物,在这里,我们定义个函数接口,来表现f(x)这个函数,通过实现这个接口,来实现具体的算法.

下面是function类的定义

public interface Function {
	public int call(int x);
}

在来定义具体的实现函数

public class ConcreteFunction implements Function {
	@Override
	public int call(int x) {
		return (x * x + 2 * x + 1);
	}
}

最后我们定义一个静态类,我们发现这个类基本上没有任何意义,只是为了进行一次计算行为,当然我们还是可以抽象出来这一次计算行为,但是在这个例子里面,我们简单一点,就是定义了一个静态类实现这个功能

public class SumUtils {

	public static final int sum(int n) {

		int temp = 0;

		for (int i = 0; i < n; i++) {
			temp = temp + new ConcreteFunction().call(i);
		}

		return temp;
	}

	public static void main(String[] args) {
		System.out.println(SumUtils.sum(10));
	}

}

最后打印出来结果是 385.

用面向对象构造出来这个过程,有两个地方比较丑陋,对于不同的f(x)我们需要定义出具体的实现类,每一个实现类代表一个具体的算法,用面向对象的观点来看,不同的逻辑函数是不同的对象,这些对象之间完全没有任何联系,而且这些对象没有任何属性,不存在封装的必要,同时也不会有被继承的特性。在计算我们想要的结果的时候,我们必须在定义无意义的对象去找出我们想要的结果,这纯粹是为了面向对象而定义对象,最后一个SumUtils类完全没有任何意义。

从上面这个例子来看,面向对象并不是任何时候都适用的。下面我们看看用函数式编程如何实现这个功能。这里我们选择scala语言来实现

def main(args: Array[String]) = {

    var f = { x: Int => x * x + 2 * x + 1 }; 
    var result = 0;

    for (val x <- 0 to 9) {
    	result = result + f(x);
    }
    
    println(result);

  }

 我们首先定义了一个f 函数,可以采用def f(x:Int) = {x*x + 2*x + 1} 的方式,也是采用代码块的方式,然后进行循环调用,计算出来结果。

从上面的代码行数来看,四行代码可以搞定。如果用一些高阶功能,代码可以做到更大皆简化和最大的扩展性。极端情况下一行代码就可以搞定。用函数来表示数学中的函数,比用对象表现数学中的函数更形象,更具有可读性。

函数式编程的特点:函数是第一公民,无副作用,内部不存在状态,易于并发。

有时候在想,面向对象和函数式编程结合起来,能够极大的简化我们的编程工作,写出跟易于扩展的和可读的代码。在设计上,两者思想是想通的。在不同的领域里面,用不同的思想去设计程序,这个是需要我们分析的。

其实面向对象程序中的设计模式,很多和函数式编程里面的思想想通。我们常用的模板模式和回调模式和函数式编程里面的高阶函数设计思想类似,当设计能力达到一定层次之后,在去看函数式编程,就会对设计模式的理解更家深入。

正好这两天也看到一个词,编程极端主义——大概说的是,当某了解某一概念的时候,在任何情况下都套用这一概念。

编程极端主义(跟极限编程没有关系)是一种接受某种理论、在所有事情上检验它、在所有地方运用它的行为。一通实验,尘埃落定后,人们通常会回想这次极端行为,认识到“不错,这很有趣,但很明显,在Y上使用X明显不合适。干这个事情我们需要使用合适的技术!”

编程极端主义能够让你在学习一门新的技术或者概念的时候更深入的了解其特性,适用性以及局限性。基本上,java语言的设计思想就是一个编程极端主义的典型用例,在java里面,基本上任何东西都是对象(除了基本的类型之外),在学习了java之后,对面向对象的方式编程会有非常深入的了解,但是思想也会被局限在其中,导致在任何时候都会用面向对象的方式去思考,而这其中有一些并不适合面向对象的设计,最典型的就是java里面的Math类。

在学习函数式编程,也可以按照这个思路去学习,忘掉面向对象的设计,在任何情况下考虑函数式思想。haskell就是一门纯粹的函数式编程。

分享到:
评论

相关推荐

    Scala函数式编程

    很大篇幅都放在,使用scala实现scala默认库文件的API中,通过对简单的函数式编程逻辑的介绍和实践,主要是实践,建立起来一个比较明晰的scala思维模式,或者叫函数式编程的思维模式。 2 无副作用的函数式编程,同时...

    python进阶-函数式编程(高级函数)

    Python函数式编程只是借鉴函数式编程的一些特点,可以理解成一半函数式,一半Python lambda表达式 函数:最大程度服用代码 存在问题:如果函数很小,很短,则会比较啰嗦 如果函数被调用次数较少,则会造成浪费 lambda表达式...

    《JavaScript函数式编程》读后感

    书中用了一句简单的话来回答了什么是函数式编程: 函数式编程通过使用函数来将值转换为抽象单元,接着用于构建软件系统。 我觉得一定有同学看了这一句还是不怎么动什么是函数式编程,且为什么要使用函数式

    C#函数式编程中的部分应用详解

    而我们需要做的就是利用这三个函数去完成对应的三个功能,笔者在这里只是进行简单而又形象的表述,实际的开发过程可能需要更多的函数,并且需要使用不同的函数式编程的方式组合才能完成对应的功能。 后面我们假设F1...

    fpjs:初学者使用Java进行函数式编程的同伴回购

    使用JavaScript进行初学者函数式编程的同伴源“为什么要学习函数式编程?” 今天编写的大多数软件过于复杂,难以理解,难以测试,难以更改且充满了难以发现的错误。 哎哟! 那么,如何解决这些问题呢? 以下是许多...

    mojo编程语言.docx

    它被设计为一种简洁、灵活且易于学习的语言,具有许多现代编程语言的特性,如动态类型、函数式编程、以及面向对象编程等。下面是关于Mojo编程语言的一些介绍: 1. **简洁易读的语法**:Mojo采用了简洁易读的语法,...

    javaparser:基于函数式组合子逻辑的JAVA语言分析框架

    简短地说,什么让函数式编程如此强大?是用简单的函数组合出复杂函数的能力。 我可以想象,说到这里,你还是一头雾水。“什么是组合?1+1不是也把两个1组合成2了吗?new A(new B(), new C())不也是从B和C组合成A了...

    functional-examples:一些希望有用的不同级别函数式编程的示例

    功能示例这里的目的是展示一些简单的现实世界代码示例,其中采用了不同级别的函数式编程方法。 它们大致处于一个进程中,您可能会发现示例 4 或 5 最有用。 前面的示例是您在理解以后的方法之前可能会做的事情。 ...

    C#函数式编程中的缓存技术详解

     可能一些人并不能立马理解这个词的含义,所以我们就简单的从生活例子出发介绍一下。很多人在工作中一定会这样做事,比如上级吩咐了你一件事,但是这件事的后半部分要等另一个同事做好之后把对应的材料给你你才能...

    JS高阶函数原理与用法实例分析

    要完全理解这个概念,首先必须了解函数式编程是什么一等函数(first-Class Function)以及的概念。 函数式编程 在大多数简单的术语中,函数编程是一种编程形式,您可以将函数作为参数传递给其他函数,并将它们作为值...

    A HASKELL 趣学指南

    haskell是一门纯函数式编程语言。在命令式语言中执行操作需要给电脑安排一组命令,随着命令的执行,状态就会随之发生改变。例如你给变量a赋值为5,而随后做了其它一些事情之后a就可能变成的其它值。有控制流程,你就...

    Analysis-of-PureScripts-Compilation-Process:通过查看函数式语言的实现方式来理解它们的概念。 源语言是PureScript,可编译为JavaScript。 该论文是在一个学期的大学项目中用德语撰写的。 也许它也可以帮助正在使用函数式编程的任何人

    事实证明,一开始的障碍比较大,难以理解基本概念(例如,当使用类型类并已经简单地添加了整数时),然后通过更高级的概念(例如函子或monads)谈论它们而变得更加容易,并且了解它们之后,首先将基本概念内在化。...

    python学习-函数

    高级特性:Python支持面向对象编程、函数式编程等高级特性,使得代码更加模块化和可重用。 广泛的库和框架:Python拥有丰富的第三方库和框架,可以快速开发各种应用。 跨平台性:Python可以在多个操作系统上运行,...

    Python高级编程.zip

    高级特性:Python支持面向对象编程、函数式编程等高级特性,使得代码更加模块化和可重用。 广泛的库和框架:Python拥有丰富的第三方库和框架,可以快速开发各种应用。 跨平台性:Python可以在多个操作系统上运行,...

    Linux系统编程.zip

    高级特性:Python支持面向对象编程、函数式编程等高级特性,使得代码更加模块化和可重用。 广泛的库和框架:Python拥有丰富的第三方库和框架,可以快速开发各种应用。 跨平台性:Python可以在多个操作系统上运行,...

    12个步骤教你理解Python装饰器

    或许你已经用过装饰器,它的使用方式非常简单但理解起来困难(其实真正理解的也很简单),想要理解装饰器,你需要懂点函数式编程的概念,python函数的定义以及函数调用的语法规则等,虽然我没法把装饰器变得简单,...

    Python网络编程.zip

    高级特性:Python支持面向对象编程、函数式编程等高级特性,使得代码更加模块化和可重用。 广泛的库和框架:Python拥有丰富的第三方库和框架,可以快速开发各种应用。 跨平台性:Python可以在多个操作系统上运行,...

Global site tag (gtag.js) - Google Analytics