2011-11-19 24 views
6

Tôi muốn viết mộtĐi qua một chức năng để một module mà không chỉ định đối số của nó

Module Arg[f_,n_] 

mà phải mất một hàm f (có < = n đối số) và một số tự nhiên n và kết quả đầu ra đối số n-thứ của hàm f.

Như một ví dụ, giả sử rằng f được xác định bởi

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

Sau đó,

Arg[f[s,t],1] 

nên s;

khi

Arg[f[u,v],2] 

nên v.

Câu hỏi của tôi là liệu điều này là có thể. Nếu vậy, tôi nên viết gì ở vị trí "???" phía dưới?

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

Lưu ý rằng tôi không muốn chỉ định A_ và b_ trong định nghĩa của Arg như

Arg[f_,a_,b_,n_] 

EDIT: "Arg" chỉ là tên của tôi cho các mô-đun không phải là chức năng nội Arg của Mathematica.

+0

Bạn nhận ra 'Arg' là một chức năng nội bộ, phải không? Bạn có nghĩa là để viết lại 'Arg' (không giống như nó từ định nghĩa) hoặc nó chỉ là một sự lựa chọn nghèo của tên chức năng? Ngoài ra, bạn có thể có nghĩa là 'Arg [f [u, v], 2]' cho 'v'? – abcd

+0

Bạn vừa sửa các chỉnh sửa của tôi @bel :) – abcd

+0

@yoda Xin lỗi: (Tôi đang gặp sự cố với JS trên trình duyệt của mình. Có lẽ đó là lý do tại sao tôi không nhận được thông báo "chỉnh sửa trước". thay đổi hoặc hợp nhất chúng với bạn –

Trả lời

10

lẽ

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

Giả dụ thứ hai của bạn nên cung cấp cho u, điều này sẽ thực hiện công việc:

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] 

cho s.

Mặc dù vậy, điều này rất nặng, vì vậy tôi hy vọng một người nào đó sẽ sớm tìm được thứ gì đó tốt hơn.

Đây là một chút tốt hơn (không xác định lại chức năng built-in thậm chí tạm thời):

ClearAll[arg2]; 
SetAttributes[arg2, HoldFirst]; 
arg2[g_, n_] := Hold[g][[1, n]] 
Các vấn đề liên quan