2011-11-19 11 views
6

voglio scrivere unpassaggio di una funzione a un modulo senza specificare suoi argomenti

Module Arg[f_,n_] 

che prende una funzione f (avente < = n argomenti) e un numero naturale n ed emette l'argomento n-esimo la funzione f.

Ad esempio, supponiamo che f è definito da

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

Poi,

Arg[f[s,t],1] 

dovrebbe essere s;

mentre

Arg[f[u,v],2] 

dovrebbe essere v.

La mia domanda è se questo è possibile. Se è così, cosa dovrei scrivere al posto di "???" sotto?

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

Si noti che io non voglio specificare a_ b_ e nella definizione di Arg come

Arg[f_,a_,b_,n_] 

EDIT: "Arg" è solo il mio nome per il modulo non la funzione interna di Arg Matematica.

+0

Ti rendi conto 'Arg' è una funzione interna, giusto? Intendevi riscrivere 'Arg' (non sembra dalla definizione) o era solo una scelta scadente del nome della funzione? Inoltre, probabilmente intendevi 'Arg [f [u, v], 2]' dà 'v'? – abcd

+0

Hai appena ridimensionato le mie modifiche @bel :) – abcd

+0

@yoda Ci scusiamo :(Ho problemi con JS sul mio browser, forse è per questo che non ho ricevuto l'avviso di "modifica precedente". cambia o uniscili con il tuo. –

risposta

10

Forse

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[[email protected]@x, x], t], 1] 

(* 
-> x^2. + Cos[Sin[x]]^2 
*) 
4

Assumendo che il secondo esempio dovrebbe dare u, questo dovrebbe fare il lavoro:

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 
    ] 

in modo che

f[a_, b_] = a^2 + b^2.; 
arg[f[s, t], 1] 

s.

Questo è molto pesante, quindi mi aspetto che qualcuno troverà qualcosa di meglio abbastanza presto.

Questo è un po 'meglio (non ridefinire funzioni built-in, anche temporaneamente):

ClearAll[arg2]; 
SetAttributes[arg2, HoldFirst]; 
arg2[g_, n_] := Hold[g][[1, n]] 
Problemi correlati