变量=函数?
有人说按照纯粹的函数式编程的观点看一切都是函数,没有变量,例如下面这样就看不到变量了。
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.计算机擅长的部分是数值化的计算。
人们总是把复杂的计算过程丢给计算机,得到结果。
自己要做好的则是梳理现实问题,写好算法,做好一一对应的工作。