我在想如何编写一个函数用于Mathematica中的Apply
函数?例如,我想平凡重新实现Or
功能,我发现下面我应该如何编写一个在Mathematica中应用的函数?
Apply[(#1 || #2)&,{a,b,c}]
是不行的,因为它只Or
“编在列表中的前两个元素。非常感谢!
我在想如何编写一个函数用于Mathematica中的Apply
函数?例如,我想平凡重新实现Or
功能,我发现下面我应该如何编写一个在Mathematica中应用的函数?
Apply[(#1 || #2)&,{a,b,c}]
是不行的,因为它只Or
“编在列表中的前两个元素。非常感谢!
这将工作,无论多少VARS,并且是一般模式:
Or[##]&,
例如
In[5]:= Or[##] & @@ {a, b, c}
Out[5]= a || b || c
然而,在的情况下,这是不够的,因为Or
是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
,可以在这样的情况下才能使用(当你不希望你的论点,以评估)。请注意,这使用Function
的无证书形式。这种形式的提及可以在R.Maeder的书中“Mathematica编程”中找到。
HTH
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
你确定你是从应用期待正确的事情?如果您查看文档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]
。是这样吗?
看着你的个人资料我看到你投票只有两次在问题和答案。那是因为你对堆栈溢出中看到的答案感到失望,或者仅仅是因为你忘记了投票? – 2011-02-01 19:52:02
@belisarius:哦,我的坏。我认为接受一个答案就够了。让我这样做,并在将来记住这一点。 :) – 2011-02-01 19:59:20