泛函编程(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),并没有进行实质的数据复制。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java架构师进阶

编写高质量代码的思考

最近在看《代码大全》,可以说是一本软件开发的百科全书,特别厚,但是干货也很多。平时写代码,代码规范是一个最低的要求(很多老代码连最低要求都达不到),为什么要这样...

862
来自专栏程序员互动联盟

【答疑释惑第三十四讲】Web js 常见用法

疑惑一 一、js中怎么实现hashcode值? 在java中有一种方法,就是可以获取字符串的对应的hashcode值,返回对应的整数值; 这个方法对于一些写在数...

3015
来自专栏瓜大三哥

UVM(八)之transaction及field_automation

UVM(八)之transaction及field_automation uvm_sequence_item派生自uvm_transaction,...

2098
来自专栏jeremy的技术点滴

免编译在JSP中直接写react代码

3775
来自专栏极客编程

Node.js 4.0的ES6新特性。

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量...

782
来自专栏Java帮帮-微信公众号-技术文章全总结

Java面试系列5

一、是否可以继承String类? String类是final类故不可以继承。 二、面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的...

3445
来自专栏程序员的知识天地

JavaScript设计模式与实践--适配器模式

适配器模式主要用来解决两个已有接口之间不匹配的问题,它不考虑这些接口是怎样实现的,也不考虑它们将来可能会如何演化。适配器模式不需要改变已有的接口,就能够使它们协...

1101
来自专栏java工会

编写高质量代码的思考

最近在看《代码大全》,可以说是一本软件开发的百科全书,特别厚,但是干货也很多。平时写代码,代码规范是一个最低的要求(很多老代码连最低要求都达不到),为什么要这样...

670
来自专栏Golang语言社区

无辜的goroutine

简介: 本文主要是针对一些对于goroutine的“指控”提出我自己的看法,特别是轩脉刃的一篇博客文章《论go语言中goroutine的使用》提出了gorout...

34911
来自专栏向治洪

Scala入门

Scala入门 Scala简介 ps:在最新的薪资调查中,Scala程序员的工资是平均最高的Scala工资。 Scala是一门多范式的编程语言,一种类似java...

1857

扫码关注云+社区