第十一章重构和测试函数式程序
本章介绍
■重构函数式程序
■使用不变性推理代码
■为 F# 程序写单元测试
■使用延迟值缓存结果
这本书的主题之一就是,函数编程理如何使解代码更容易理解,只需要通过阅读就可以;特别是在需要修改陌生程序,或者通过组合现有函数实现行为,或者重构现有的代码时,尤为重要。函数式编程更容易重构,缘于清晰度和模块化:可以改善代码,并且有信心这种改变不会破...
分类:
其他好文 时间:
2015-01-04 17:15:20
阅读次数:
136
10.3 连续(continuations)
从本章开始,我们讨论递归调用。我们已经看到过尾递归(tail recursion),这是进行递归调用的重要技术,不需要在栈分配任何空间。由于有了尾递归,写出的函数式列表处理函数,能够处理大型数据集,而不需要出一身汗。
我们已经使用尾递归重写了许多函数,利用累加器参数,但并不是每个函数都能这样重写。如果函数需要执行两个递归调用,那么,很显然不能...
分类:
其他好文 时间:
2015-01-03 14:40:31
阅读次数:
104
10.2.3.1 以函数方式使用数组
我们先来看一个 F# 的例子,这是两个F# 库处理数组的重要的高阶函数,然后,用 C# 实现相同的功能。清单 10.12 的中脚本,先用随机数初始化一个数组,然后,计算出它们的平方。
清单 10.12 处理数组的函数式方法(F# Interactive)
> let rnd = new System.Random();;
val rnd...
分类:
编程语言 时间:
2015-01-02 17:35:06
阅读次数:
226
10.2.3 处理数组
数组相似于简单的计算机内存模型,本质上,就是一组有编号的盒子,只要知道的编号,就可以轻松地读取或更改在任何盒子中的值。数组形成连续的内存块,所以,开销非常小,能用于存储大型数据集;数组[的代间]是提前分配的:一旦创建,其大小就固定了,因此,不能把新的值添加已有的数组中。
数组是可变的数据结构,因此,很容易修改。这在有些情况下是有用的,但对于函数式程序员来说,在有关...
分类:
编程语言 时间:
2015-01-01 17:22:50
阅读次数:
154
10.2.2.1 添加元素到列表
到目前为止,我们已经看到如何追加元素到已有(函数式)列表的前面;如果我们想在列表的末尾追加元素,又该如何做呢?这要求听起来是合理的,那么,我们尝试实现它。清单 10.10 显示了在列表的前面和在后面插入naïve 企图之间性能的差别。
清单10.10 在列表中添加元素(F# Interactive)
> let prepend el list =...
分类:
其他好文 时间:
2015-01-01 00:15:00
阅读次数:
240
lambda表达式是函数式编程的基础。咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下。这里只是介绍C++11中的lambda表达式自己的认识。这里有参考文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/...
分类:
编程语言 时间:
2014-12-31 11:15:02
阅读次数:
233
underscore.js 越看越美,如果在项目中不断尝试underscore的方法,将会事半功倍underscore 体现出 functionial javascript的思想,采用函数式编程的思路来解决日常生活中的一些 util的小问题javascript 属于弱语言,对象类型用得最多的就是 a...
分类:
其他好文 时间:
2014-12-28 16:46:06
阅读次数:
6905
Scala基本概念 +IDE 推荐:《Scala编程》1 基本概念 在Spark开发中,Scala被认为是目前和Spark兼容最好的语言。 Scala运行在标准的java平台,可以与java无缝交互。 Scala是一种把面向对象和函数式编程加入静态类型语言的混合体。 特点: 面向对象 Sc...
分类:
其他好文 时间:
2014-12-28 15:23:39
阅读次数:
636