检查对"变量"与"价值","功能"与"抽象"的理解

mod*_*ler 6 variables haskell function lambda-calculus

(这个问题是在研究Haskell时对此问题的跟进.)

我曾经发现"变量"和"价值"之间的概念令人困惑.因此,我阅读了关于lambda演算的wiki页面以及上面的上一个答案.我出来以下解释.

我可以确认这些是否正确吗?只想双重确认,因为这些概念非常基本但对函数式编程至关重要.欢迎任何建议.

维基的前提:

Lambda Calculus语法
exp→ID
| (exp)
| λID.exp//抽象
| exp exp //应用程序

(符号:"<=>"相当于)

解释:

  1. "值":它是存储在计算机中的实际数据或指令.
    "变量":它是一种定位数据的方式,一种替换值的引用,但本身不是存储在计算机中的数据或指令集.
    "抽象"<=>"函数"∈句法形式.(/sf/answers/1773041021/)
    "应用程序":它接受"抽象"的输入,并且"lambda表达式"的输入产生"lambda表达式".
    "抽象"被称为"抽象",因为在通常的函数定义中,我们将(通常更长的)函数体缩写为更短的形式,即函数标识符后跟一个形式参数列表.(虽然lambda抽象是匿名函数,但其​​他函数通常都有名称.)

  2. "可变" <=>"符号" <=>"引用"
    一个"可变的"是经由被称为"绑定"处理的"值"相关联.

  3. "常数"∈"变量"
    "文字"∈"值"
    "形式参数"∈"变量"
    "实际参数"(参数)∈"值"

  4. "变量"可以具有"数据"的"值"=>例如变量"a"具有值3

  5. "变量"也可以具有"一组指令"的"值"=>例如,运算符"+"是变量

Lui*_*las 8

"值":它是存储在计算机中的实际数据或指令.

你试图在机器方面非常具体地考虑它,我担心这会让你感到困惑.最好用数学来思考它:价值只是一个永远不会改变的东西,比如数字42,字母'H'或构成"Hello world"的字母序列.

另一种思考方式是心理模型.我们发明心理模型以间接推理世界; 通过推理心理模型,我们对现实世界中的事物进行预测.我们编写计算机程序来帮助我们可靠地大量使用这些心理模型.

那么价值就是心理模型中的东西.位和字节只是将模型编码到计算机的体系结构中.

"变量":它是一种定位数据的方式,一种替换值的引用,但本身不是存储在计算机中的数据或指令集.

变量只是一个名称,代表程序某个范围内的值.每次评估变量时,都需要在环境中查找其值.在计算机术语中有几种这种概念的实现:

  • 急切语言中的堆栈帧是在每次调用例程时查找局部变量值的环境的实现.
  • 链接器提供了在程序编译或加载到内存时查找全局范围名称的环境.

"抽象"<=>"函数"∈句法形式.

抽象和功能不相同.在lambda演算中,"抽象"是一种句法表达,但函数是一个值.

一个不太简陋的比喻是名称和描述事物.名称和描述是语言的一部分,而事物则是世界的一部分.您可以说名称或描述的含义是它命名或描述的内容.

语言包含事物的简单名称(例如,12是十二号的名称)和更复杂的事物描述(5 + 7是十二号的描述).lambda抽象是函数的描述; 例如,表达式\x -> x + 7是对其参数添加七的函数的描述.

诀窍在于,当描述变得非常复杂时,要弄清楚他们描述的是什么并不容易.如果我给你12345 + 67890,你需要做一些工作来弄清楚我刚刚描述的数字.计算机是能够比我们更快,更可靠地完成这项工作的机器.

"application":它接受"抽象"的输入,并且"lambda表达式"的输入产生"lambda表达式".

应用程序只是一个带有两个子表达式的表达式,它通过这种方式描述一个值:

  1. 第一个子表达式代表一个函数.
  2. 第二个子表达代表一些价值.
  3. 整个应用程序代表将(1)中的函数应用于(2)中的值所产生的值.

在形式语义中(并且不要害怕那个词)我们经常使用双括号⟦∙⟧代表"意义"; 例如⟦dog⟧="狗的意思." 使用该表示法:

?e1 e2? = ?e1?(?e2?)
Run Code Online (Sandbox Code Playgroud)

where e1e2是任何两个表达式术语(任何变量,抽象或应用程序).

"抽象"被称为"抽象",因为在通常的函数定义中,我们将(通常更长的)函数体缩写为更短的形式,即函数标识符后跟一个形式参数列表.(虽然lambda抽象是匿名函数,但其​​他函数通常都有名称.)

说实话,我从来没有停下来思考"抽象"一词是否是一个很好的术语,或者为什么它被选中.一般来说,通过数学计算,除非条款被严格挑选并误导人,否则不应该提出这样的问题.

"常数"∈"变量"

"文字"∈"价值"

lambda演算本身并不具有"常数"或"字面"的概念.但是,定义这些的一种方法是:

  • 文字是一种表达式,由于语言的规则,无论在何处发生,它总是具有相同的值.
  • 在纯函数式语言中,常量是程序最高范围内的变量.该变量的每个(非阴影)使用在程序中始终具有相同的值.

"形式参数"∈"变量"

"实际参数"(参数)∈"值"

形式参数是变量的一种用法.在表单的任何表达式中?v.e(where v是变量并且e是表达式),v是一个形式变量.

参数是作为应用程序的第二个子表达式出现的任何表达式(不是值!).

"变量"可以具有"数据"的"值"=>例如变量"a"具有值3

所有表达式都有值,而不仅仅是变量.例如,5 + 7是一个应用程序,它的值为12.

"变量"也可以具有"一组指令"的"值"=>例如,运算符"+"是变量

+是一个函数 - 它是添加其参数的函数.指令集是该函数的实现.

将函数看作一个抽象表,它表示对于每个参数值组合,结果是什么.说明的方式是这样的:

  1. 对于很多函数,我们无法将它们作为表格实际实现.在添加的情况下,因为表格无限大.
  2. 即使对于我们可以枚举案例的函数,我们也希望更加简单有效地实现它们.

但是,在某种意义上,检查函数实现是否正确的方法是检查在每种情况下它都会执行"无限表"所做的相同操作.以这种方式检出的两组指令实际上是同一功能的两种不同实现.