2011-02-01 72 views
3

我在想如何编写一个函数用于Mathematica中的Apply函数?例如,我想平凡重新实现Or功能,我发现下面我应该如何编写一个在Mathematica中应用的函数?

Apply[(#1 || #2)&,{a,b,c}] 

是不行的,因为它只Or“编在列表中的前两个元素。非常感谢!

+1

看着你的个人资料我看到你投票只有两次在问题和答案。那是因为你对堆栈溢出中看到的答案感到失望,或者仅仅是因为你忘记了投票? – 2011-02-01 19:52:02

+0

@belisarius:哦,我的坏。我认为接受一个答案就够了。让我这样做,并在将来记住这一点。 :) – 2011-02-01 19:59:20

回答

11

这将工作,无论多少VARS,并且是一般模式:

Or[##]&, 

例如

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

Out[5]= a || b || c 

然而,在的情况下,这是不够的,因为OrHoldAll和短路 - 也就是说,它停止在第一个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 

,可以在这样的情况下才能使用(当你不希望你的论点,以评估)。请注意,这使用Function的无证书形式。这种形式的提及可以在R.Maeder的书中“Mathematica编程”中找到。

HTH

4
Or @@ {a, b, c}  

等效

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 
0

你确定你是从应用期待正确的事情?如果您查看文档http://reference.wolfram.com/mathematica/ref/Apply.html,您会看到Apply [f,expr]只是用expr替换f的头部。它确实是而不是,一般来说给f [expr]。

如果您希望使用函数f操作expr,请尝试f @ expr或f [expr]。

也许你理解了上面和你真正的问题是,“我怎么定义了一些的f,当我做Apply[f,{a,b,c}],做同样的工作作为Or[a,b,c]。是这样吗?

相关问题