Wolfram mathematica 我应该如何编写一个函数以用于Apply in Mathematica?

Wolfram mathematica 我应该如何编写一个函数以用于Apply in Mathematica?,wolfram-mathematica,Wolfram Mathematica,我想知道如何编写一个用于Mathematica中的Apply函数的函数?例如,我想简单地重新实现或函数,我发现 Apply[(#1 || #2)&,{a,b,c}] 不正常,因为它只或列出了列表中的前两个元素。非常感谢 Or @@ {a, b, c} 等价物 Apply[Or, {a, b, c}] {a, b, c} /. {x_, y__} -> Or[x, y] 等价物 Apply[Or, {a, b, c}] {a, b, c} /. {x_

我想知道如何编写一个用于Mathematica中的
Apply
函数的函数?例如,我想简单地重新实现
函数,我发现

Apply[(#1 || #2)&,{a,b,c}]
不正常,因为它只
列出了列表中的前两个元素。非常感谢

Or @@ {a, b, c}     
等价物

Apply[Or, {a, b, c}]  
{a, b, c} /. {x_, y__} -> Or[x, y]  
等价物

Apply[Or, {a, b, c}]  
{a, b, c} /. {x_, y__} -> Or[x, y]  
应用如下工作:

{2 #1, 3 #2, 4 #3} & @@ {a, b, c}  
{2 a, 3 b, 4 c}

Plus[2 #1, 3 #2, 4 #3] & @@ {a, b, c}
2 a + 3 b + 4 c

你确定你期望从Apply得到正确的东西吗?如果您查看文档,就会发现Apply[f,expr]只是用expr替换了f的头。一般来说,它不会给出f[expr]

如果希望在expr上使用函数f进行操作,请尝试f@expr或f[expr]


也许你理解了上面的内容,你的问题是,“当我应用[f,{a,b,c}]
时,如何定义一些f,它们与
或[a,b,c]
的作用相同。是吗?

这将起作用,不管有多少变量,这是一个通用模式:

Or[##]&,
比如说

In[5]:= Or[##] & @@ {a, b, c}

Out[5]= a || b || c
但是,在
的情况下,这还不够好,因为
HoldAll
和短路-也就是说,它在第一个
True
语句时停止,并保持其余语句未计算。例如:

In[6]:= Or[True, Print["*"]]

Out[6]= True

In[7]:= Or[##] & @@ Hold[True, Print["*"]]

During evaluation of In[7]:= *

Out[7]= True
不过,这没问题:

Function[Null,Or[##],HoldAll],
比如说,

In[8]:= Function[Null, Or[##], HoldAll] @@ Hold[True, Print["*"]]

Out[8]= True
并且可以在这种情况下使用(当您不希望自己的参数求值时)。请注意,这使用了一种未记录的
函数形式
。在R.Maeder的《Mathematica编程》一书中提到了这种形式


HTH

查看您的个人资料,我发现您对问题和答案只投了两次票。这是因为您对在Stack Overflow中看到的答案感到失望,还是仅仅因为您忘记了投票?@belisarius:哦,我的错。我认为接受答案已经足够好了。让我这样做,并在将来记住这一点。:)甚至是答案你不接受可能仍然有用,值得一投。@Simon,当然。我真的很感激所有的答案和帖子。:)如果有办法订阅你的答案,我会的!每次都能学到新的东西:-)。@Timo很遗憾,Stack overflow没有提供这种功能。在中有很多这样的要求,但是运行网站的人不希望“用户对用户”“面向对象的功能。@Timo谢谢。我正在编写我的书的第二版,这本书的内容将比第一版多得多。目前最大的问题实际上是减少信息量,但保留信息,而不是增加信息量。希望有一天它会出版)@Leonid Shifrin关于这本书的好消息:-)@Leonid谢谢!像
Function[Null,或[#]、HoldAllComplete][False,Print[“*”][code>和
Function[s,或[s],HoldAllComplete][False,Print[“*”][False,Print[“*”][False,Print[“*”][code>与
Function[Null,或[#或[#]HoldAllComplete][False,Print[“*”][code>这样的例子都是说教的!另一个很好的例子是
函数[s,或[s],HoldAllComplete][Sequence[False,Print[“*”]]]