mod*_*ler 6 variables haskell function lambda-calculus
(这个问题是在研究Haskell时对此问题的跟进.)
我曾经发现"变量"和"价值"之间的概念令人困惑.因此,我阅读了关于lambda演算的wiki页面以及上面的上一个答案.我出来以下解释.
我可以确认这些是否正确吗?只想双重确认,因为这些概念非常基本但对函数式编程至关重要.欢迎任何建议.
维基的前提:
Lambda Calculus语法
exp→ID
| (exp)
| λID.exp//抽象
| exp exp //应用程序
(符号:"<=>"相当于)
解释:
"值":它是存储在计算机中的实际数据或指令.
"变量":它是一种定位数据的方式,一种替换值的引用,但本身不是存储在计算机中的数据或指令集.
"抽象"<=>"函数"∈句法形式.(/sf/answers/1773041021/)
"应用程序":它接受"抽象"的输入,并且"lambda表达式"的输入产生"lambda表达式".
"抽象"被称为"抽象",因为在通常的函数定义中,我们将(通常更长的)函数体缩写为更短的形式,即函数标识符后跟一个形式参数列表.(虽然lambda抽象是匿名函数,但其他函数通常都有名称.)
"可变" <=>"符号" <=>"引用"
一个"可变的"是经由被称为"绑定"处理的"值"相关联.
"常数"∈"变量"
"文字"∈"值"
"形式参数"∈"变量"
"实际参数"(参数)∈"值"
"变量"可以具有"数据"的"值"=>例如变量"a"具有值3
"值":它是存储在计算机中的实际数据或指令.
你试图在机器方面非常具体地考虑它,我担心这会让你感到困惑.最好用数学来思考它:价值只是一个永远不会改变的东西,比如数字42,字母'H'或构成"Hello world"的字母序列.
另一种思考方式是心理模型.我们发明心理模型以间接推理世界; 通过推理心理模型,我们对现实世界中的事物进行预测.我们编写计算机程序来帮助我们可靠地大量使用这些心理模型.
那么价值就是心理模型中的东西.位和字节只是将模型编码到计算机的体系结构中.
"变量":它是一种定位数据的方式,一种替换值的引用,但本身不是存储在计算机中的数据或指令集.
变量只是一个名称,代表程序某个范围内的值.每次评估变量时,都需要在环境中查找其值.在计算机术语中有几种这种概念的实现:
"抽象"<=>"函数"∈句法形式.
抽象和功能不相同.在lambda演算中,"抽象"是一种句法表达,但函数是一个值.
一个不太简陋的比喻是名称和描述与事物.名称和描述是语言的一部分,而事物则是世界的一部分.您可以说名称或描述的含义是它命名或描述的内容.
语言包含事物的简单名称(例如,12是十二号的名称)和更复杂的事物描述(5 + 7是十二号的描述).lambda抽象是函数的描述; 例如,表达式\x -> x + 7是对其参数添加七的函数的描述.
诀窍在于,当描述变得非常复杂时,要弄清楚他们描述的是什么并不容易.如果我给你12345 + 67890,你需要做一些工作来弄清楚我刚刚描述的数字.计算机是能够比我们更快,更可靠地完成这项工作的机器.
"application":它接受"抽象"的输入,并且"lambda表达式"的输入产生"lambda表达式".
应用程序只是一个带有两个子表达式的表达式,它通过这种方式描述一个值:
在形式语义中(并且不要害怕那个词)我们经常使用双括号⟦∙⟧代表"意义"; 例如⟦dog⟧="狗的意思." 使用该表示法:
?e1 e2? = ?e1?(?e2?)
Run Code Online (Sandbox Code Playgroud)
where e1和e2是任何两个表达式或术语(任何变量,抽象或应用程序).
"抽象"被称为"抽象",因为在通常的函数定义中,我们将(通常更长的)函数体缩写为更短的形式,即函数标识符后跟一个形式参数列表.(虽然lambda抽象是匿名函数,但其他函数通常都有名称.)
说实话,我从来没有停下来思考"抽象"一词是否是一个很好的术语,或者为什么它被选中.一般来说,通过数学计算,除非条款被严格挑选并误导人,否则不应该提出这样的问题.
"常数"∈"变量"
"文字"∈"价值"
lambda演算本身并不具有"常数"或"字面"的概念.但是,定义这些的一种方法是:
"形式参数"∈"变量"
"实际参数"(参数)∈"值"
形式参数是变量的一种用法.在表单的任何表达式中?v.e(where v是变量并且e是表达式),v是一个形式变量.
参数是作为应用程序的第二个子表达式出现的任何表达式(不是值!).
"变量"可以具有"数据"的"值"=>例如变量"a"具有值3
所有表达式都有值,而不仅仅是变量.例如,5 + 7是一个应用程序,它的值为12.
"变量"也可以具有"一组指令"的"值"=>例如,运算符"+"是变量
值+是一个函数 - 它是添加其参数的函数.指令集是该函数的实现.
将函数看作一个抽象表,它表示对于每个参数值组合,结果是什么.说明的方式是这样的:
但是,在某种意义上,检查函数实现是否正确的方法是检查在每种情况下它都会执行"无限表"所做的相同操作.以这种方式检出的两组指令实际上是同一功能的两种不同实现.
| 归档时间: |
|
| 查看次数: |
3361 次 |
| 最近记录: |