泛函編程(5)-數據結構(Functional Data Structures)

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

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

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

1、不可变特性(Immutable)

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

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

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

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

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

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

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

再看看泛函风格:

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

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

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

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

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

  

更多相关文章
  • 一.List数据类型的方法   定义两个list,a和b:a=[1,2,3,4],b=[7,8,9,10] a.append(x)            在a的末尾附加x元素 a.extend(b)        
  • 泛函編程(8)-數據結構-Tree
        上节介绍了泛函数据结构List及相关的泛函编程函数设计使用,还附带了少许多态类型(
  •      折叠算法是List的典型算法.通过折叠算法可以实现众多函数组合(function composition).所以折叠算法也是泛函编程里的基本组件(function combinator).了解折叠算法的原理对了解泛函组合有着至关紧要的幫助.折叠算法又可分右折叠和左折叠.我们先从右折叠(fo
  •     List是一种最普通的泛函数据结构,比较直观,有良好的示范基础.List就像一个管子,里面可以装载一长条任何类型的东西.如需要对管子里的东西进行处理,则必须在管子内按直线顺序一个一个的来,这符合泛函编程的风格
  • UNIX環境編程學習筆記(3)——文件I/O之內核 I/O 數據結構
    lienhua342014-08-27 内核使用三种数据结构表示打开的文件,分别是文件描述
  • 1.XML:SAX工具 DOM工具 2.JSON:NSJson //ios5.0以后             SBJson JSonKit //5.0之前   解析:从事先规定好的格式中提取数据  前提:提前约定好格式 XML:可扩展标记语言,主流数据格式之一,用来标记数据,定义数据类型.  功能:
  • 基础知识的回顾不再写到这里面了,会写一些算法算法的解答或者读一些相关书籍的笔记. 今天做了一道算法题,来自微软必应·英雄会第三届在线编程大赛:几个bing? 做出来了...但不知道为啥执行测试用例失敗,也许不对吧,求
  • 以下是在编程面试中排名前10的算法相关的概念,我会通过一些简单的例子来阐述这些概念.由于完全掌握这些概念需要更多的努力,因此这份列表只是作为一个介绍.本文将从Java的角度看问题,包含下面的这些概念:   1. 字符串   如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法. toChar
一周排行