我想知道如何编写一个在Mathematica的Apply
函数中使用的函数?例如,我想简单地重新实现Or
函数,我发现了以下内容
Apply[(#1 || #2)&,{a,b,c}]
不合适,因为它只列出了Or
个列表中的前两个元素。非常感谢!
答案 0 :(得分:11)
无论有多少变量,这都有效,并且是一般模式:
Or[##]&,
例如
In[5]:= Or[##] & @@ {a, b, c}
Out[5]= a || b || c
但是,对于Or
,这还不够好,因为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
答案 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]
完成相同的工作。是吗?