N0---关于变量

变量=函数?

有人说按照纯粹的函数式编程的观点看一切都是函数,没有变量,例如下面这样就看不到变量了。

print(f(g(x)));

有人说按照声明式的编程观点看一切都是变量的赋值过程,没有函数,例如

select x=(select y = select(z = 1))

-----------------------------------------------------------------------------------------------------------------------------

当然,两者都是诡辩。

前者把变量藏了起来。

后者把运算过程藏了起来。

但是它们给人美丽的幻想,让人觉得二者可以相互代替。

仔细讨论

虽说y = f(x),那么f(x)=y;正过来,反过去都是对的。

但是他们并不能相互代替,回到变量和函数在数学中最初的定义其实就能分清了。

【变量】实际是一个容器,里面可以放数字。

【函数】实际是一种对应关系。

y=f(x)中间的【等于号】的意思是,x经过一种对应关系f,最终得到的结果等于y。

函数是--------对应关系----过程----动词;

变量是--------------容器----结果----名词。

这样就把二者区分开来了。

不可混为一谈

马克思说:人是社会关系的总和。

这样说,乍一看是把变量和函数混为一谈了。因为【人】是个名词,也就是变量,【社会关系】是一种关系,也就是函数。

但是仔细看看,【人】是一个名词,但是【社会关系】并非一个动词。

【社会关系】是动词的指代物,动词的指代物是一个名词。

我【爱】这个人,这个人是我的【爱人】。

我【赡养】父母,我是父母的【赡养人】。

社会关系的具体内容【爱】【赡养】是动词,但是我们要把这些名词化,就能讨论了。

名词,可以指代动词。

变量,可以容纳函数--------通常我们会说把函数当作一个变量(术语是委托)-------函数的内容本身是做一些动作---------但是名词化后变成了变量只看到了输入输出。

简而言之,名词可以指代动作,变量可以指代函数,但是不能说手指就是月亮。

-------------------------------------------------------------------------------------------------------------------------------------

一一对应

一一对应可能是最简单的关系,是理解的基础。

1根手指代表1只羊,2根手指代表2只羊,3只手指代表3只羊。

当一个符号,能够被人对应到现实中的事物时,事物本身的【信息】就被抽象了出来,人就可以纸上谈兵了。

【数字】是现实中各种存在的各种数量的指代,

【数字式】是对现实中各种基本数量关系的抽象,是对动词的抽象,是二次抽象。

【代数】则是,对数字的指代,是对现实的三次抽象。

第一次:【数字】--量词

数字1可以代表1根手指也可以代表1只山羊。

数字2可以代表2根手指也可以代表2只山羊。

1,2,3,4等数字代指了纯粹的数量。

第二次:【数字式】--动词

3只山羊,杀掉1只,还剩2只。

3个杯子,打碎1个,还剩2个。

3-1=2

我用统一的动词【-】,代替了杀掉/打碎等等动词,【-】把原来动词中,和数量无关的关系丢弃了。

第三次:【代数式】--量词的代词。

x-y=z

我对数字本身又抽象了一次,这就有了代数,才有了后来的程序。

一一对应的意义

一一对应是数学开始的地方,也是每一个有意义的数学运算结束的地方。

【一一对应是理解的基础】这是我的个人经验和猜想,上面的数学史是一个论据。

一开始的对应是简单的;中间的推理是人难以理解的;最终的结果是对应某种事实的。很多的数学过程都是这样的。

用户不知道你怎么干的,但是知道我怎么操作,得到我想看的东西。用户对你的软件就要有一些理解,需要理解操作和结果是怎么对应的。

对于用户来说,软件永远是声明式的,用户说要有光,然后就有了光。而各种计算都是机器的事情。

总结

1.计算机程序归根结底就是数学。

程序=数据结构+算法。

程序就是一篇描述变量如何变化的文章。

这是关于计算机程序的本质。

实现需求才是程序本质?不对,我可以写着玩。

这种让变量发生变化,计算的能力,也是计算机得名的原因。

2.计算机擅长的部分是数值化的计算。

人们总是把复杂的计算过程丢给计算机,得到结果。

自己要做好的则是梳理现实问题,写好算法,做好一一对应的工作。

然后,从一一对应开始,并且不断的抽象,解决更多的问题。

 

posted @ 2019-01-25 17:10  法宝  阅读(284)  评论(0编辑  收藏  举报