为了更好地理解函数式编程,我正在阅读lambda calculus here的wiki页面。
定义说:
如果x是变量且M∈Λ,则(λx.M)∈Λ
直觉上我认为变量是/由单字母id表示。但是,由于我们在这里处理严格的数学定义,我只想再次证实这种理解:一般来说,表达式可以归类为变量吗?
e.g。如果x
是变量,则表达式(x + x)
是lambda演算中的变量吗?也就是可以写(λ(x + x).M)作为lambda演算抽象?
(关注在某些情况下这是真的。例如Here:An expression such as 4x^3 is a variable
)
答案 0 :(得分:1)
不,(x + x)
不是变量(实际上它甚至不是天真的lambda演算中的表达式)。
我认为你以某种方式混合了变量和表达式这两个术语(或者想要某种模式匹配?)。
那么让我们按照lambda-calculus的核心定义和表达式:
定义本身并不那么难(事实上,你自己将它与wiki页面联系起来)。 从一开始就提到它:
v_1, v_2, ...
)(当然你可以根据需要命名它们 - 重要的是你要记住它们被认为是不同 符号在您的微积分中)λ
,.
,(
和)
这就是 - 这个语法 / calculus的所有“ Tokens ”。
现在有一些规则如何构建表达式:
E
是表达式且x
是变量,则(λx.E)
是表达式(此处x
和{{1}是模板或 Metavariables - 你必须用一些真正的表达式填充它们才能使它成为一个表达式!)E
和A
是表达式,则B
是表达式。所以可能的表达方式是:
(A B)
v_50
(λv_4.v_5)
这就是表达方式。
你知道:如果你从一开始就没有允许 ((λv_4.v_5) v_50)
作为变量的符号或名称,那么它永远不会是变量 - 事实上即使表达式也不是变量有一些表达式只包含一个所述变量 - 如果你调用某个表达式,它将永远不会是变量(再次);)
PS:当然有一些惯例可以使括号保持一点 down - 但是一开始你不需要那些。