Передача функции в модуль без указания его аргументов - PullRequest
6 голосов
/ 20 ноября 2011

Я хочу написать

 Module Arg[f_,n_] 

, которая принимает функцию f (имеющую <= n аргументов) и натуральное число n и выводит n-й аргумент функции f. </p>

В качестве примера предположим, что f определяется как

f[a_,b_]=a^2+b^2. 

Тогда

Arg[f[s,t],1] 

должно быть s;

пока

Arg[f[u,v],2] 

должно быть v.

Мой вопрос: возможно ли это? Если так, что я должен написать вместо "???" ниже

Arg[f_,n_] := Module[{}, ??? ]

Обратите внимание, что я не хочу указывать a_ и b_ в определении Arg, например

 Arg[f_,a_,b_,n_]

РЕДАКТИРОВАТЬ: «Arg» это просто мое имя для модуля, а не внутренняя функция Arg Mathematica.

Ответы [ 2 ]

10 голосов
/ 20 ноября 2011

Возможно

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
*)
5 голосов
/ 20 ноября 2011

Предполагая, что ваш второй пример должен дать 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]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...