检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

2024-05-18

(这个问题是后续问题this one https://stackoverflow.com/questions/25327705/is-function-a-sort-of-variable/25329157#25329157在学习 Haskell 时。)

我曾经发现“变量”和“值”之间的概念令人困惑。因此,我阅读了 lambda 演算的 wiki 页面以及上面的先前答案。我得出以下解释。

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

场地来自wiki http://en.wikipedia.org/wiki/Lambda_calculus:

Lambda 演算语法
经验 → ID
| (经验值)
| λ ID.exp // 抽象
| exp exp // 应用

(表示法:“”相当于)

释义:

  1. “值”:是计算机中存储的实际数据或指令。
    “变量”:它是一种定位数据的方式,是一种值替换的引用,但它本身并不是计算机中存储的一组数据或指令。
    “抽象” “功能” ∈ 句法形式。 (https://stackoverflow.com/a/25329157/3701346 https://stackoverflow.com/a/25329157/3701346)
    “应用程序”:它接受“抽象”的输入,以及“lambda 表达式”的输入,产生“lambda 表达式”。
    “抽象”之所以被称为“抽象”,是因为在通常的函数定义中,我们将(通常较长的)函数体缩写为更短的形式,即函数标识符后跟形式参数列表。 (虽然 lambda 抽象是匿名函数,但其​​他函数通常确实有名称。)

  2. “变量”“符号”“参考”
    “变量”通过称为“绑定”的过程与“值”相关联。

  3. “常量” ∈ “变量”
    “文字” ∈ “值”
    “形式参数” ∈ “变量”
    “实参”(自变量)ε“值”

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

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

“值”:是计算机中存储的实际数据或指令。

你试图从机器的角度来非常具体地思考它,我担心这可能会让你感到困惑。最好从数学角度来思考:值只是一个永远不会改变的东西,就像数字 42、字母“H”或构成“Hello world”的字母序列。

另一种思考方式是心理模型。我们发明心智模型是为了间接推理世界;通过推理心理模型,我们对现实世界中的事物做出预测。我们编写计算机程序来帮助我们可靠地、大量地处理这些心理模型。

那么价值观就是心智模型中的事物。位和字节只是编码将模型融入到计算机的体系结构中。

“变量”:它是一种定位数据的方式,是一种值替换的引用,但它本身并不是计算机中存储的一组数据或指令。

变量只是代表程序特定范围内的值的名称。每次对一个变量求值时,都需要在一个变量中查找它的值环境。这个概念在计算机术语中有多种实现方式:

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

“抽象” “功能” ∈ 句法形式。

抽象和功能并不等同。在 lambda 演算中,“抽象”是一种语法表达式,但函数是一个值。

一个不太寒酸的比喻是名称和描述 vs. things。名称和描述是language,而事物是一部分world。您可以说名称或描述的含义是它命名或描述的事物。

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

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

“应用程序”:它接受“抽象”的输入,以及“lambda 表达式”的输入,产生“lambda 表达式”。

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

  1. 第一个子表达式代表一个函数。
  2. 第二个子表达式代表某个值。
  3. 整个应用程序代表将 (1) 中的函数应用到 (2) 中的值所得到的值。

在形式语义中(不要害怕这个词)我们经常使用双括号 ⟦∙⟧ 来代表“的含义”;例如⟦dog⟧ = “狗的意思。”使用该符号:

⟦e1 e2⟧ = ⟦e1⟧(⟦e2⟧)

where e1 and e2是任意两个表达式 or terms(任何变量、抽象或应用程序)。

“抽象”之所以被称为“抽象”,是因为在通常的函数定义中,我们将(通常较长的)函数体缩写为更短的形式,即函数标识符后跟形式参数列表。 (虽然 lambda 抽象是匿名函数,但其​​他函数通常确实有名称。)

说实话,我从未停下来思考“抽象”这个词是否适合这个词,或者为什么选择它。一般来说,对于数学来说,提出这样的问题是没有好处的,除非术语选择得非常糟糕并且误导了人们。

“常量” ∈ “变量”

“文字” ∈ “值”

lambda 演算本身没有“常数”或“文字”的概念。但定义这些的一种方法是:

  • 文字是一种表达式,由于语言的规则,无论出现在何处,它始终具有相同的值。
  • 在纯函数式语言中,常量是程序最顶层范围的变量。该变量的每次(非隐藏)使用在程序中始终具有相同的值。

“形式参数” ∈ “变量”

“实参”(自变量)ε“值”

形式参数是一种use一个变量的。以任何形式表达λv.e (where v是一个变量并且e是一个表达式),v是一个形式变量。

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

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

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

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

的价值+是一个函数——它是添加其参数的函数。该指令集是一个执行该功能的。

将函数视为一个抽象表,它表示对于参数值的每个组合,结果是什么。指令的输入方式是这样的:

  1. 对于很多函数,我们无法将它们真正实现为表格。在加法的情况下,这是因为表将无限大。
  2. 即使对于我们可以枚举情况的函数,我们也希望更简单、更高效地实现它们。

但是检查函数是否实现的方式是correct从某种意义上说,是为了检查在每种情况下它都执行与“无限表”相同的操作。以这种方式检查的两组指令实际上是同一功能的两种不同实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象” 的相关文章

随机推荐

  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 异步迭代器

    我有以下代码 while slowIterator hasNext performLengthTask slowIterator next 由于迭代器和任务都很慢 因此将它们放入单独的线程中是有意义的 这是对迭代器包装器的快速而肮脏的尝试
  • 立体太阳图 matplotlib 极坐标图 python

    我正在尝试创建一个与以下类似的简单的立体太阳路径图 http wiki naturalfrequent com wiki Sun Path Diagram http wiki naturalfrequency com wiki Sun Pa
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • IIF(...) 不是公认的内置函数

    我正在尝试在 Microsoft SQL Server 2008 R2 中使用它 SET SomeVar SomeOtherVar IIF SomeBool value when true value when false 但我收到一个错误
  • 在 IntelliJ 中运行 Spring Boot 会导致 Unable to load 'javax.el.E​​xpressionFactory'

    我正在尝试运行一个简单的 Spring Boot 应用程序 该应用程序具有以下 Maven pom file
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 填充 CoreData 创建的 sqlite 数据库

    我有一个由 CoreData 模型自动创建的 sqlite DB 但我的应用程序不会让用户能够将数据写入其中 而是我想用程序所需的所有数据预先填充它 我的问题是 CoreData 创建的 sqlite DB 具有未知的表和字段 这些表和字段
  • 如何在 React Native 上显示 SVG 文件?

    我想显示 svg 文件 我有一堆 svg 图像 但我找不到显示的方式 我尝试使用Image and Use的组成部分反应本机 svg https github com magicismight react native svg但他们不这样做
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • Spring MockMVC、Spring 安全和 Mockito

    我想测试一个Spring Boot休息控制器 使用Spring security 并在其中使用模拟 我尝试过使用 Mockito 但我认为任何模拟工具都应该可以解决问题 为了在我的测试中启用 Spring 安全性 我首先执行以下操作 Run
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • Jenkins 的代码覆盖率 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Alexa - 包罗万象

    我有一个插入后端和 DialogFlow ApiAI 的聊天机器人 我正在尝试在 Alexa 中设置一项技能 以便我可以捕获与我的技能相关的所有内容 然后将其转发到我的后端 以便我可以使用现有的基础设施和 convo 设计 我一直在努力与
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • AWS RDS MySql - 如何在设置“公开可用”后允许访问

    刚刚使用默认设置和用户 密码创建了新的 AWS RDS MySql 实例 我也将其设置为publicly available并在此过程中创建新的 VPC 目前无法从我的笔记本电脑连接到此 RDS mysql h endpoint u myu
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell