泛函编程(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 条评论
登录 后参与评论

相关文章

来自专栏阮一峰的网络日志

尾调用优化

尾调用(Tail Call)是函数式编程的一个重要概念,本文介绍它的含义和用法。 ? 一、什么是尾调用? 尾调用的概念非常简单,一句话就能说清楚,就是指某个函数...

3085
来自专栏小李刀刀的专栏

ASP中的数字和字符比较

昨晚和老迷聊天聊到很晚,说到一个把字符串转换为数字进行比较的问题。老迷说他喜欢保持字符串本身的类型,进行字符串的匹配比较,而不喜欢把字符串强制转换为数字进行比较...

2748
来自专栏V站

关于php的成员变量和全局变量

而php中的全局变量是global定义下的全局变量,是真正的属于当前页面,或者当前文件都能使用的比如:

2506
来自专栏一“技”之长

JavaScript基础之四——选择与循环结构

    选择结构与循环结构是编程中处理逻辑的核心结构,JavaScript中支持if-else和switch-case选择结构,支持for,for-in,do-...

491
来自专栏Java架构师进阶

BATJ架构师常见面试题汇总之一 让你瞬间升华起来

优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素...

432
来自专栏北京马哥教育

百度大牛总结十条 Python 面试题检验你的真实水平

学Python最简单的方法是什么?推荐阅读:Python开发工程师成长魔法 概述 Python 是个非常受欢迎的编程语言,随着近些年机器学习、云计算等技术的发...

2616
来自专栏成猿之路

Java面试题-基础篇一

可以有多个类,但只能有一个public的类,并且public的类名必须和文件名一致。

873
来自专栏Python小屋

Python 3.6新特性(部分)

Python 3.6.0于2016年12月23日正式发布,除了本文提到的这一部分比较重要的新特性之外,还有很多标准库也新增了部分功能,等有时间再慢慢整理。 1、...

2735
来自专栏IMWeb前端团队

操作符混淆工具

1 序 1.1 从一段神奇的JS代码说起 前段时间在公众号看到一段神奇的代码,它长这个样子: (!(~+[])+{})[--[~[]][+[]]*[~+[]]+...

1967
来自专栏猿人谷

Java初学者需掌握的30个概念

基本概念:       1.OOP中唯一关心的是对象的接口是什么,就像计算机的销售商她不管电源内部结构 是怎样的,他只关系能否给你提供电就行了,也就是只要知道c...

16110

扫码关注云+社区