2011-11-19 72 views
6

我想要寫一個傳遞的功能的模塊,而不指定其參數

Module Arg[f_,n_] 

,需要一個函數f(具有< = n個參數)和自然數n,並輸出的第n個自變量函數f。

作爲一個例子,假設f由

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

然後,

Arg[f[s,t],1] 

應該是已定義;

Arg[f[u,v],2] 

應訴

我的問題是,這是否是可能的。如果是這樣,我應該寫什麼來代替「???」下面?

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

請注意,我不希望指定A_和B_在精氨酸的定義,就像

Arg[f_,a_,b_,n_] 

編輯:「精氨酸」只是我的模塊不是內部函數名精氨酸數學。

+0

你會意識到'Arg'是一個內部函數,對不對?你是不是要重寫'Arg'(看起來不像是定義中的)還是隻是一個糟糕的函數名稱選擇?另外,你可能是指'Arg [f [u,v],2]'給出'v'? – abcd

+0

你剛剛搞砸了我的編輯@bel :) – abcd

+0

@yoda對不起:(我在瀏覽器中遇到了一些JS問題,也許這就是爲什麼我沒有收到「以前的編輯」通知。改變或合併他們與你的。 –

回答

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

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

假設你的第二個例子應該給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]]