【问题标题】:Passing a function to a module without specifying its arguments将函数传递给模块而不指定其参数
【发布时间】:2011-11-19 23:07:31
【问题描述】:

我想写一篇

 Module Arg[f_,n_] 

接受一个函数 f(有

例如,假设 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。

【问题讨论】:

  • 你知道Arg是一个内部函数,对吧?你的意思是重写Arg(从定义上看不像)还是只是函数名的错误选择?另外,您可能的意思是Arg[f[u,v],2]v
  • 你把我的编辑搞砸了@bel :)
  • @yoda 抱歉 :(。我在浏览器上使用 JS 时遇到了一些问题。也许这就是我没有收到“先前编辑”通知的原因。随意回滚我的更改或合并它们和你的。
  • @belisarius Nah,不用担心 :)
  • 感谢您的编辑和回答。

标签: wolfram-mathematica


【解决方案1】:

也许

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
*)

【讨论】:

    【解决方案2】:

    假设您的第二个示例应该给出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]]
    

    【讨论】:

      猜你喜欢
      • 2022-08-14
      • 1970-01-01
      • 2017-12-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      相关资源
      最近更新 更多