纯函数和规则中的变量

ModuleWith 可以给出作为局部处理的符号名序列. 但有时需要直接将某些变量名进行局部处理.

例如,在使用 Function[{x},x+a] 等纯函数时,x 是一个形式参数,这个名称是局部的. 在规则 f[x_]->x^2 或定义 f[x_]:=x^2 中出现的 x 也是这样.

Wolfram 语言用统一的方法去保证在纯函数和规则中出现的形式参数是局部的,且不与全局变量混淆. 其基本的思想是必要时用形如 x$ 的符号去代替形式参数. 作为一个约定,x$ 从不用作全局变量名.

这里是一个纯函数的嵌套.
In[1]:=
Click for copyable input
Out[1]=
Wolfram 语言重新命名函数内的形式参数 y 以避免与全局对象 y 冲突.
In[2]:=
Click for copyable input
Out[2]=
这样得到的纯函数与所期望的一样.
In[3]:=
Click for copyable input
Out[3]=

一般来说,在对象如 Function[vars,body] 中的形式参数当另一个纯函数修改了 body 时 Wolfram 语言就要重新命名.

由于纯函数内发生了变化,形式参数 y 就被重新命名.
In[4]:=
Click for copyable input
Out[4]=
当函数内部没有变化时,形式参数就不重新命名.
In[5]:=
Click for copyable input
Out[5]=

Wolfram 语言在对纯函数中的形式参数重命名时比较自由. 原则上,函数中的形式参数与代换到纯函数中表达式的项不冲突时可以不用重新命名. 但为了一致起见,在这种情况下,Wolfram 语言还是对形式参数重新命名.

这时,在函数内的形式参数 x 屏蔽了函数体,故不需要进行重命名.
In[6]:=
Click for copyable input
Out[6]=
这里是三重函数嵌套.
In[7]:=
Click for copyable input
Out[7]=
这种情况下两个内层函数都重新命名.
In[8]:=
Click for copyable input
Out[8]=

正如 "纯函数" 所述,Wolfram 语言中纯函数类似于形式逻辑中的 表达式. 对形式参数重新命名使 Wolfram 语言纯函数再次产生标准 表达式的所有语法.

Function[{x,},body]局部参数
lhs->rhs lhs:>rhs局部模式名
lhs=rhs lhs:=rhs局部模式名
With[{x=x0,},body]局部常数
Module[{x,},body]局部变量

Wolfram 语言中的定界结构.

Wolfram 语言中有一些定界结构,其中某些名称作为局部变量处理,当这些结构混合时,Wolfram 语言进行适当的重命名以避免冲突.

Wolfram 语言重新命名纯函数中的形式参数以避免冲突.
In[9]:=
Click for copyable input
Out[9]=
这里 With 内的局部参数被重新命名以避免冲突.
In[10]:=
Click for copyable input
Out[10]=
这种情况下变量名之间没有冲突,故没有进行重新命名.
In[11]:=
Click for copyable input
Out[11]=
在模块中局部变量 y 重新命名以避免冲突.
In[12]:=
Click for copyable input
Out[12]=
执行模块时,局部变量又一次重新进行命名,以使得名称唯一.
In[13]:=
Click for copyable input
Out[13]=

Wolfram 语言将变换规则当定界结构处理,其中模式的名称是局部的. 可以用 x_x__ 等或 x:patt 建立命名的模式.

h 中的 xx_ 相同,在规则中作为局部量.
In[14]:=
Click for copyable input
Out[14]=

f[x_]->x+y 等规则右端出现的 x 与名为 x_ 的模式匹配. 于是,x 被当作规则的局部量处理,不能用其它定界结构去修改.

另一方面,y 在规则中不是局部量,可以用其它定界结构去修改. 当这种情况发生时,Wolfram 语言重新对规则中的模式命名以防止冲突.

Wolfram 语言对规则中的 x 重新命名以防止冲突.
In[15]:=
Click for copyable input
Out[15]=

在一个定界结构中使用 With 时,Wolfram 语言就自动地进行适当的重新命名. 但有时需要在定界结构中进行代换以免重命名. 这可以用 /. 运算实现.

当用 With 代替 y 时,纯函数中的 x 被重新命名以防止冲突.
In[16]:=
Click for copyable input
Out[16]=
当使用 /. 而不是 With 时,没有进行这类重新命名.
In[17]:=
Click for copyable input
Out[17]=

当使用规则如 f[x_]->rhs 或定义如 f[x_]:=rhs 时,Wolfram 语言必须间接地替换出现在表达式 rhs 中的 x,它用 /. 运算有效地完成此项工作. 于是,这些替换不遵循定界结构. 然而,当定界结构的内部由替换修改后时,在定界结构中的其它变量被重新命名.

这里定义了一个产生纯函数的函数.
In[18]:=
Click for copyable input
xx^2 通过使用 /. 运算被简洁地插入纯函数之中.
In[19]:=
Click for copyable input
Out[19]=
这里定义产生一对嵌套函数的函数.
In[20]:=
Click for copyable input
此时,纯函数外的 x 被重新命名.
In[21]:=
Click for copyable input
Out[21]=