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

Can*_*tor 6 wolfram-mathematica

我想写一个

 Module Arg[f_,n_] 
Run Code Online (Sandbox Code Playgroud)

它接受函数f(具有<= n个参数)和自然数n并输出函数f的第n个参数.

例如,假设f由...定义

f[a_,b_]=a^2+b^2. 
Run Code Online (Sandbox Code Playgroud)

然后,

Arg[f[s,t],1] 
Run Code Online (Sandbox Code Playgroud)

应该是;

Arg[f[u,v],2] 
Run Code Online (Sandbox Code Playgroud)

应该是v.

我的问题是这是否可行.如果是这样,我应该写什么"???" 下面?

Arg[f_,n_] := Module[{}, ??? ]
Run Code Online (Sandbox Code Playgroud)

注意,我不想在Arg的定义中指定a_和b_

 Arg[f_,a_,b_,n_]
Run Code Online (Sandbox Code Playgroud)

编辑:"Arg"只是模块的名称而不是Mathematica的内部函数Arg.

Dr.*_*ius 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
*)
Run Code Online (Sandbox Code Playgroud)


acl*_*acl 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
  ]
Run Code Online (Sandbox Code Playgroud)

以便

f[a_, b_] = a^2 + b^2.;
arg[f[s, t], 1]
Run Code Online (Sandbox Code Playgroud)

s.

虽然这非常严厉,所以我希望有人能够尽快找到更好的东西.

这有点好(甚至暂时不重新定义内置函数):

ClearAll[arg2];
SetAttributes[arg2, HoldFirst];
arg2[g_, n_] := Hold[g][[1, n]]
Run Code Online (Sandbox Code Playgroud)