问题与Mathematica中的符号替换

All*_*lly 2 symbols wolfram-mathematica substitution

我想定义一个符号并在函数中使用它.例如,将IDnumbers定义为数字列表:

ParallelMap[{#1, Name[#1], Age[#1]} &, IDnumbers]
Run Code Online (Sandbox Code Playgroud)

随着userlist={#1, Name[#1], Age[#1]}变成:

ParallelMap[userlist &, IDnumbers]
Run Code Online (Sandbox Code Playgroud)

它可以在代码中使用列表本身,但不能使用符号.字符串列表与分配给字符串列表的符号相同.为什么是这样?

Thi*_*cke 7

既然f[#]&是简写,Function[f[#]]你应该总是用尾随完成你的匿名函数&来获得一个有效的函数.在你的例子中:

userlist={#1, Name[#1], Age[#1]}&
ParallelMap[userlist, IDnumbers]
Run Code Online (Sandbox Code Playgroud)

更彻底的解释:

通过使用像f[#]你这样的东西得到(in FullForm[])

In[15]            := f[#] // FullForm
Out[15]//FullForm  = f[Slot[1]]
Run Code Online (Sandbox Code Playgroud)

而后者由尾随&运算符转换为函数:

In[16]            := f[#]& // FullForm
Out[16]//FullForm  = Function[f[Slot[1]]]
Run Code Online (Sandbox Code Playgroud)

如果分两步执行此操作,&则不评估中间变量expr:

In[25]:= expr = f[#]//FullForm
In[26]:= expr &
Out[25]//FullForm = f[Slot[1]]
Out[26]           = expr &
Run Code Online (Sandbox Code Playgroud)

您可以exprFunction[]使用Evaluate[]以下内容之前强制进行评估:

In[27]:= expr=f[#]//FullForm
In[28]:= Evaluate[expr]&
Out[27]//FullForm = f[Slot[1]]
Out[28]           = f[Slot[1]]&
Run Code Online (Sandbox Code Playgroud)

另一种方法是自己提供Function[]包装:

userlist={#1, Name[#1], Age[#1]}
ParallelMap[Function[userlist], IDnumbers]
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会考虑这种糟糕的编码风格.只是习惯于总是完成一个带有尾随的匿名函数,&就像你将一个关闭的paranthesis )提供给相应的开头一样(.

编辑 确定,在您动态生成匿名函数的情况下,我可以看到为什么您无法&直接提供.只需用Slot[]s中的表达式包装表达式Function[].