编程即是编制对数据进行运算的过程。特殊的运算必须用特定的数据结构来支持有效运算。如果没有数据结构的支持,我们就只能为每条数据申明一个内存地址了,然后使用这些地址来操作这些数据,也就是我们熟悉的申明变量再对变量进行读写这个过程了。试想想如果没有数据结构,那我们要申明多少个变量呢。所以说,数据结构是任何编程不可缺少的元素。

泛函编程使用泛函数据结构(Functional Data Structure)来支持泛函程序。泛函数据结构的特点是”不可变特性“(Immutability), 是泛函编程中函数组合(composition)的必需。所以,与其它编程范畴不同,泛函编程的泛函数据结构必须具体一套特定的数据运算方式。

泛函数据结构及运算方法具备以下特征:

1、不可变特性(Immutable)

2、运算在数据结构内进行。尽量避免使用中间变量

3、运算返回新的数据结构作为结果

我们先看看熟悉的OOP数据运算风格:

 scala> var arr = Array(1,2,3)
arr: Array[Int] = Array(1, 2, 3)
 scala> var sum = arr(0)+arr(1)+arr(2)
sum: Int = 6

以上运算是需要中间变量的。而且是在结构外进行的:先把数据从地址读出再相加。

 scala> arr(0) = sum

 scala> arr
res9: Array[Int] = Array(6, 2, 3)

直接赋值后arr内容变了。在这里arr是“可变的”(Mutable)数据结构。肯定的是如果下面需要再次使用arr时,我们是无法保证它内容一致性的。

再看看泛函风格:

 scala> val arr = Array(1,2,3)
arr: Array[Int] = Array(1, 2, 3)
scala> val sum = arr.sum
sum: Int = 6

泛函运算直接在数据结构内进行,不需要中间变量。

 scala> val arr1 = arr map { x => if(x == 1) sum else x }
arr1: Array[Int] = Array(6, 2, 3) scala> arr
res10: Array[Int] = Array(1, 2, 3)

arr1是赋值后新的数据结构。arr没有变化。这样我们可以放心使用arr来进行函数组合了。

可能这里会出现一些误解:arr1先复制了arr内的数据后再修改内容,所以arr没有变。这样理解有对也有不对:从效果来说arr1是复制了arr。但从具体做法上系统只是把arr(0)下面节点的指针指向了arr1(0),并没有进行实质的数据复制。

泛函编程(5)-数据结构(Functional Data Structures)的更多相关文章

  1. 数据结构(Data Structures)

    一.List数据类型的方法 定义两个list,a和b:a=[1,2,3,4],b=[7,8,9,10] a.append(x)            在a的末尾附加x元素 a.extend(b)   ...

  2. scala泛函编程是怎样被选中的

    现在计算机技术发展现象是:无论硬件技术如何发展都满足不了软件需求:无论处理器变得能跑多快,都无法满足软件对计算能力的需要.按照摩尔定律(Moore's Law)处理器(CPU)每平方面积上包含的半导体 ...

  3. 泛函编程(8)-数据结构-Tree

    上节介绍了泛函数据结构List及相关的泛函编程函数设计使用,还附带了少许多态类型(Polymorphic Type)及变形(Type Variance)的介绍.有关Polymorphism的详细介绍会 ...

  4. 无锁数据结构(Lock-Free Data Structures)

    一个星期前,我写了关于SQL Server里闩锁(Latches)和自旋锁(Spinlocks)的文章.2个同步原语(synchronization primitives)是用来保护SQL Serve ...

  5. 泛函编程(6)-数据结构-List基础

    List是一种最普通的泛函数据结构,比较直观,有良好的示范基础.List就像一个管子,里面可以装载一长条任何类型的东西.如需要对管子里的东西进行处理,则必须在管子内按直线顺序一个一个的来,这符合泛函编 ...

  6. [CareerCup] 10.2 Data Structures for Large Social Network 大型社交网站的数据结构

    10.2 How would you design the data structures for a very large social network like Facebook or Linke ...

  7. 剪短的python数据结构和算法的书《Data Structures and Algorithms Using Python》

    按书上练习完,就可以知道日常的用处啦 #!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving wit ...

  8. 泛函编程(7)-数据结构-List-折叠算法

    折叠算法是List的典型算法.通过折叠算法可以实现众多函数组合(function composition).所以折叠算法也是泛函编程里的基本组件(function combinator).了解折叠算法 ...

  9. 怎样学习Scala泛函编程

    确切来说应该是我打算怎么去学习Scala泛函编程.在网上找不到系统化完整的Scala泛函编程学习资料,只好把能找到的一些书籍.博客.演讲稿.论坛问答.技术说明等组织一下,希望能达到学习目的.关于Sca ...

随机推荐

  1. salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)

    我们都知道,报表有个功能为导出excel,但是有的时候客户需求往往标准的报表达不到,比如导出excel,其中本月修改的数据字段标红,如下图所示. 这就需要我们去写VF来实现此功能. 需求:将数据表记录 ...

  2. 每天一个linux命令(19):find 命令概览

    Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...

  3. Aspect Oriented Programming

    AOP(Aspect Oriented Programming),面向切面编程(也叫面向方面)是目前软件开发中的一个热点.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度 ...

  4. javascript中数组和字符串的方法比较

    × 目录 [1]可索引 [2]转换 [3]拼接[4]创建[5]位置 前面的话 字符串和数组有很多的相同之处,它们的方法众多,且相似度很高:但它们又有不同之处,字符串是不可变值,于是可以把其看作只读的数 ...

  5. Android属性动画之ObjectAnimator

    相信对于Android初学者,对于Android中的动画效果一定很感兴趣,今天为大家总结一下刚刚学到的属性动画案例. 首先和一般的Android应用一样,我们先建一个工程,为了方便,我们的布局文件中就 ...

  6. 10分钟学会理解和解决MySQL乱码问题

    在阅读本文之前,强烈建议对字符集编码概念还比较模糊的同学 阅读下博主之前对相关概念的一篇科普:十分钟搞清字符集和字符编码 本博客已经迁移至: http://cenalulu.github.io/ 为了 ...

  7. 漫谈可视化Prefuse(一)---从SQL Server数据库读取数据

    上篇<可视化工具solo show-----Prefuse自带例子GraphView讲解>主要介绍了整个Prefuse工具集具有的一些特征.框架的运行流程,分析并展现了官方提供的例子Gra ...

  8. JavaScript中{}+{}

    在 JavaScript 中,加法的规则其实很简单,只有两种情况: 把数字和数字相加 把字符串和字符串相加 所有其他类型的值都会被自动转换成这两种类型的值. 为了能够弄明白这种隐式转换是如何进行的,我 ...

  9. android调试输出

    测试时不想直接debug总要调试输出一些字符串信息,那以下方法可选: 1.用Log.i(TAG, "onCreate");日志输出. 先要引用 import android.uti ...

  10. Android性能测试工具(一)之Emmagee

    Android性能测试工具(一) 之Emmagee Emmagee是监控指定被测应用在使用过程中占用机器的CPU.内存.流量资源的性能测试小工具. 支持SDK:Android2.2以及以上版本 Emm ...