`
rysh0818
  • 浏览: 23852 次
  • 性别: 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就是一门纯粹的函数式编程。

分享到:
评论

相关推荐

    函数式编程思维.pdf_函数式编程_函数式编程思维_

    此外,由于函数式编程强调不可变性,它可以减少错误,使调试变得更加简单。 函数式编程语言或支持函数式特性的语言,如Haskell、Lisp、Scala、F#和JavaScript(通过ES6的箭头函数和闭包),提供了丰富的工具和概念...

    用C++进行函数式编程

    ### 用C++进行函数式编程 #### 引言 函数式编程作为一种编程范式,在软件工程领域中引起了广泛的关注。这种编程方式强调程序运算结果的确定性和不变性,能够帮助开发者更好地理解和管理代码的状态变化,尤其是在...

    函数式编程中文版.pdf

    代码组合是函数式编程中用于构建复杂行为的方法,通过组合简单的函数来创建更为复杂的函数逻辑。代码组合可以增加代码的可读性和可维护性。 Hindley-Milner类型签名是一种在编译时进行类型推导的系统,它能自动推断...

    JavaScript函数式编程.pdf

    以上是对“JavaScript函数式编程”可能包含的知识点的一个大致介绍。考虑到文档中提供的信息有限,这些知识点基于通用的JavaScript函数式编程概念。如果要详细学习和应用这些概念,需要查看具体的教材或者文档来获取...

    JS 函数式编程指南 PDF

    首先,我们需要理解函数式编程的概念及其重要性。函数式编程是一种编程范式,它强调使用函数来表达计算逻辑,其中函数被视为一等公民,意味着函数可以作为参数传递、作为结果返回以及赋值给变量。它与命令式编程相对...

    Scala函数式编程

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

    《Java函数式编程》_高清华.zip

    Java函数式编程是一种将函数作为一等公民的编程范式,它强调使用函数来构造程序,减少...通过理解和熟练掌握上述知识点,开发者可以更好地利用Java 8及以后的版本进行高效、简洁的函数式编程,提升代码质量和开发效率。

    函数式编程另类指南.pdf

    这种对完美概念的追求,类似于函数式编程中追求纯粹和不变性的理念。 #### 三、函数式编程的特点 - **纯函数**:函数的输出只依赖于输入参数,不会改变外部状态。 - **不可变数据**:使用不可变数据结构,一旦创建...

    JS函数式编程指南

    本指南旨在帮助读者深入理解函数式编程的基本概念及其在JavaScript中的应用。 #### 第1章: 我们在做什么? ##### 介绍 在这一章节中,作者首先引入了函数式编程的概念,并解释了为什么JavaScript是一种理想的用于...

    javascript 函数式编程

    3. **代码简洁性**:函数式编程强调避免副作用,使代码更易理解,更便于测试。 4. **并行处理**:由于函数式编程不依赖外部状态,函数可以并行执行,这对于多核处理器和异步编程场景非常有利。 5. **函数组合**:...

    面向函数式编程-讲解

    在函数式编程中,程序由纯函数构成,这意味着一个函数如果给定相同的输入,总是会产生相同的输出,且不会对程序的其他部分产生影响。 **函数式编程的好处:** 1. **可读性强**:函数式编程强调函数的纯粹性和表达...

    ios-简单便捷的函数式编程--view的frame设置.zip

    本资源“ios-简单便捷的函数式编程--view的frame设置.zip”聚焦于如何利用函数式编程的思想来简化iOS应用中视图(View)的frame设置。下面我们将详细探讨这一主题。 首先,让我们了解函数式编程的基本概念。函数式...

    用函数式编程技术编写优美的 JavaScript

    与传统的过程性编程强调的是如何执行一系列操作不同,函数式编程关注的是数据流及如何对数据进行转换。这种编程方式的核心在于使用纯函数,即函数的结果仅依赖于其输入参数,且没有副作用。这种方式有助于减少代码中...

    83丨开源实战三(下):借GoogleGuava学习三大编程范式中的函数式编程1

    尽管Java最初设计为面向对象编程语言,但随着版本的更新,它引入了对函数式编程的支持。Java 8及更高版本引入了Lambda表达式和函数接口,使得函数可以像对象一样被传递和操作,增强了函数式编程的能力。Lambda表达式...

    js函数式编程

    通过以上对函数式编程的基本概念及其在JavaScript中的应用的探讨,我们可以看到函数式编程不仅是一种编程范式,更是一种思维方式。它鼓励开发者以更加抽象和通用的方式来思考问题,从而编写出更加优雅和高效的代码。

    java 8 函数式编程 (源码)

    Richard Warburton 的《java 8 函数式编程》是一本深入解析这一主题的书籍,由王群峰翻译,提供了丰富的示例和练习来帮助读者理解并掌握这些新特性。 函数式编程的核心概念在Java 8中主要体现在以下几个方面: 1. ...

    JavaScript ES6函数式编程入门经典_javascript_tall7cj_

    JavaScript ES6函数式编程入门经典是一本针对JavaScript开发者,尤其是初学者的教程,旨在帮助他们掌握ES6(ECMAScript 2015)的新特性,并深入理解函数式编程的概念和实践。函数式编程是一种编程范式,它强调将计算...

    傻瓜函数式编程.docx

    尽管理解和掌握函数式编程需要时间和努力,但它带来的好处,如代码的简洁性、可读性和并发处理能力,使其在软件开发领域具有重要价值。通过深入学习和实践,开发者能够逐步克服学习难点,将函数式编程的优势融入到...

Global site tag (gtag.js) - Google Analytics