将函数传递给模块而不指定其参数

时间:2011-11-19 23:07:32

标签: wolfram-mathematica

我想写一个

 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。

2 个答案:

答案 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]]