我想写一个
Module Arg[f_,n_]
取函数f(具有< = n参数)和自然数n并输出函数f的第n个参数。
例如,假设f由
定义f[a_,b_]=a^2+b^2.
然后,
Arg[f[s,t],1]
应该是s;
而
Arg[f[u,v],2]
应该是v。
我的问题是这是否可行。如果是这样,我应该写什么“???”下面?
Arg[f_,n_] := Module[{}, ??? ]
请注意,我不想在Arg的定义中指定a_和b_,如
Arg[f_,a_,b_,n_]
编辑:“Arg”只是模块的名称而不是Mathematica的内部函数Arg。
答案 0 :(得分:10)
也许
SetAttributes[arg, HoldFirst];
arg[f_[x___], n_] := {x}[[n]]
f[a_, b_] := a^2 + b^2.
arg[f[arg[f[s, t], 1], t], 1]
arg[f[s, t], 2]
(*
-> s
-> t
*)
arg[ArcTan[f[Cos@Sin@x, x], t], 1]
(*
-> x^2. + Cos[Sin[x]]^2
*)
答案 1 :(得分:5)
假设你的第二个例子应该给u
,这应该可以胜任:
ClearAll[arg];
SetAttributes[arg, HoldFirst];
arg[g_, n_] := Module[
{tmp, ret},
Unprotect[Part];
tmp = Attributes[Part];
SetAttributes[Part, HoldFirst];
ret = Part[g, n];
ClearAttributes[Part, HoldFirst];
SetAttributes[Part, tmp];
Protect[Part];
ret
]
这样
f[a_, b_] = a^2 + b^2.;
arg[f[s, t], 1]
给出s
。
但这非常严厉,所以我希望有人会很快找到更好的东西。
这样做有点好(即使暂时也不重新定义内置函数):
ClearAll[arg2];
SetAttributes[arg2, HoldFirst];
arg2[g_, n_] := Hold[g][[1, n]]