2011-04-04 9 views
8

Diga, tengo alguna función f[a_,b_,c_]=a+b+c. Ahora necesito definir otra función, g[f_,d_]=f+d, donde el f aquí debe reemplazarse por la definición de f, lo que da como resultado a+b+c+d.Función de una función

¿Cómo puedo hacer esto? Intenté g[f_,d_]=f+d/.f->Definition[f], pero eso no funcionó.

+3

Su pregunta parece ser: "¿Cómo se define una función que toma otra función como uno de sus argumentos" – DavidC

Respuesta

11

Bueno, su configuración requiere que g sea una función de a, byc, ya que explícitamente hizo que f funcione. en su lugar podría hacer:

f[a_,b_,c_]=a+b+c; 

g[f_,a_,b_,c_,d_] = f[a,b,c]+d 

de salida [2] = a + b + c + d

Daniel Lichtblau

2

Daniel's answer es la correcta - que responde a lo que su pregunta debería haber pedido!

Pero por diversión aquí hay algo más cercano a lo que realmente hizo su pregunta.

f[a_,b_,c_] := a + b + c 

g[f_, d_] := Catch[Module[{dv}, 
    Check[dv = DownValues[f], Throw[$Failed], {DownValues::sym}]; 
    Switch[Length[dv], 
     0, Print["No DownValues"]; $Failed, 
     1, dv[[1, 2]] + d, 
     _?(# > 1 &), Print["More than one DownValue - using the first!"]; 
         dv[[1, 2]] + d, 
     _, Print["huh?!"]; $Failed]]] 

prueba de que:

In[3]:= g[f, d] 
Out[3]= a + b + c + d 

definir otra función:

ff[a_, b_, c_] := a b c 

In[5]:= g[ff, d] 
Out[5]= a b c + d 

y darle una segunda definición:

In[6]:= ff[a_, b_] := a + b 
In[7]:= DownValues[ff] 
Out[7]= {HoldPattern[ff[a_,b_,c_]] :> a b c, HoldPattern[ff[a_,b_]] :> a+b} 

In[8]:= g[ff, d] 
During evaluation of In[8]:= More than one DownValue - using the first! 
Out[8]= a b c + d 

Por supuesto, el hecho de que Don Pase cualquier argumento al f en g[f_,d_] (en la mayoría de los casos) hará que este tipo de cosas sean bastante inútiles ...

+0

por cierto: en lo anterior, "primero" no significa la primera definición dada. Significa el primero en el orden en que Mathematica los almacena. – Simon

+0

¡LOL! Estaba escribiendo un comentario sobre la respuesta de Daniel explicando por qué la pregunta no tiene sentido ... fui a una reunión breve y cuando volví, ¡halló su respuesta! ¡También puedes responder preguntas incorrectas! ¡Genio puro! +1 –

3

Solo una nota al margen.

Todo tiene más sentido cuando ambas funciones comparten los mismos argumentos, o los argumentos para la segunda función están implícitos en el primero.

Por ejemplo:

f[x_] := 1 + 1/x; 

g[h_, x_] := h[x]^x; 

Limit[g[f, x], x -> +Infinity] 
-> E 

O algo así

f[x_] := EuclideanDistance[x, #] & 

g[f_, x_] := If[f[2 x]@x < 3, x, 2 x] 

g[f, 3] 
->6 

g[f,2] 
->2 
1

También me resulta difícil discernir su intención, pero esta es mi interpretación:

f[a_, b_, c_] := a + b + c 
g[f_, d_] := f[##] + d &; 

g[f, 3] 

    (* Out= f[##1] + 3 &  *) 

%[q, r, s] 

    (* Out= 3 + q + r + s *) 

g[f, 5][1, 2, 3] 

    (* Out= 11 *) 

esta manera , g[f, x] devuelve una función que pasa sus argumentos al f.

2

En el definiton

f[a_, b_, c_] := a+b+c 

vistazo a a, b y c como el tercer argumento primera, segundo y en la llamada de función y NO símbolos a, b o c.Similar a f := (#1 + #2 + #3)&, la llamada al f (sin argumentos) no dará los resultados deseados.

Tal vez quería hacer algo como esto:

f := a+b+c 

Ahora, el f se asocia como una suma de a, y bc, que son símbolos globales y no funciona argumentos. Entonces,

f+d 

dará a + b + c + d y se puede utilizar ReplaceAll (o /.) para la sustitución:

f + d /. a->2x 

da b+c+d+2x. 2 f dará 2 (a+b+c), Sin[f] dará Sin[a+b+c], f-c dará a+b etc ...

Cuestiones relacionadas