《SICP•2.1 数据抽象简介·2.1.3数据意味着什么?》What Is Meant by Data?何谓数据、数据意味着什么?
这一节写得不易理解。yqj2065真的不知道作者为什么要这样写!
1.数据 Vs. 函数
从汇编语言开始,我们知道“正是这种简单的代码“MOV AX,1234H”刻画出程序的最为底层的构造单元:指令和数据”。
按照命令式编程的观点,数据(data),也被称为操作数(operands)或数据值,是内存中保存的数值,随着语言的进步,数据形式/数据类型越来越丰富。例如Java中有数值如整数2、小数(浮点数)3.5,逻辑数据true、false、字符如' A '、'和'、字符串如"Java"以及各种各样的对象数据。
按照函数式编程的观点,数据(data)是被操作的对象,(+ 1 2)中1、2是操作数,(map (lambda (x) (* x *)) (list 1 2 3) )中,(lambda (x) (* x *))和(list 1 2 3)是操作数。
这仅仅说明,函数式编程中,函数是(能够作为)数据!
但是Scheme不认识(2 + 1),因为2并不是函数。换言之,数据不都是函数。再怎样模糊,数据和函数仍然是有重大区别的。(我们把1、3.14等称为数据,再补充说明,函数可以作为操作数,一切不就太平了)
2.什么意思?
Exercise 2.6 we can get by without numbers!
“如果觉得将序对表示最为过程还不足以令人如雷灌顶,那么请考虑,在一个可以对过程做各类操作的语言中,我们完全可以没有数”——在函数式编程语言中,以λ运算构造一切是其立足点。以Scheme为例,在丘奇数的基础上,其语言可以完全没有数!(数字只不过是语法糖)。
这才是我最难以理解的地方。
丘奇数(Church numeral)是高阶函数,不难搞懂。2是一个数,命令式程序员给我两个苹果,函数式程序员敲响两次木鱼...我知道2就可以了,管你两个苹果还是两次操作。不是讲解数据的接口与数据的实现分离吗,为什么在“数据意味着什么?”标题下提到丘奇数。
假设Java中,我在(假设)《1.2Java数据类型1.2.1·int有多长》写到int有32位,然后在习题中给一个题目:“我们完全能够让int有64为长”。这就是我不理解的地方,因为我绝对不会这样写。
换言之,我会这样说:程序员们需要知道2是一个数,至于实现,可以用两个苹果或两次操作,例如在lambda运算中,一切都是lambda表达式!在这里2由lambda表达式定义,称为丘奇数2。(不知道这一节 是不是这个意思)
3.数据的接口与数据的实现
But exactly what is meant by data? It is not enough to say "whatever is implemented by the given selectors and constructors"。
这个问题“数据意味着什么?”,和随后的说明.....我知道其意思,但是解说得很炒蛋。我给你一个类A,你说它是分数还是复数还是什么数?
class A{
private int num; //分子numerator
private int den = 1; //分母denominator
public int getNumerator(){return num;}
public int getDenominator (){return den;}
public A(){this(0);}
}
selectors and constructors,Java中你给出构造器和setter,你就要我知道它是什么数据抽象?当然不行,所以,需要add求和看出,嗯这是分数的求和,所以这是分数类。
然后,(按照Java来说),add这种“必须满足的一组特定条件”,不仅服务于类A这种“高层”定义,也符合int这种低层的东西,如int是32位,我们可以完全能够让int有64为长.....但是如果你用int来计算,你无法区分int有64为长还是32位...(哔哔哔哔)
数据抽象意味着什么?程序员按照数据类型的抽象特征思考和使用该数据,数据的实现不需要知道——有很多不同的实现方式。反正我是这样开始介绍数据抽象的。