我应该如何编写要在Mathematica中应用的函数?

时间:2011-02-01 19:29:18

标签: wolfram-mathematica

我想知道如何编写一个在Mathematica的Apply函数中使用的函数?例如,我想简单地重新实现Or函数,我发现了以下内容

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

不合适,因为它只列出了Or个列表中的前两个元素。非常感谢!

3 个答案:

答案 0 :(得分:11)

无论有多少变量,这都有效,并且是一般模式:

Or[##]&,

例如

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

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

但是,对于Or,这还不够好,因为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

答案 1 :(得分: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

答案 2 :(得分: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]完成相同的工作。是吗?