功能的功能

时间:2011-04-04 22:37:37

标签: wolfram-mathematica

说,我有一些功能f[a_,b_,c_]=a+b+c。现在我需要定义另一个函数g[f_,d_]=f+d,其中f应该被f的定义替换,从而产生a+b+c+d

我该怎么做?我尝试了g[f_,d_]=f+d/.f->Definition[f],但是没有用。

5 个答案:

答案 0 :(得分:11)

嗯,你的设置要求g是a,b和c的函数,因为你明确地将f作为其函数。可以改为:

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

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

Out [2] = a + b + c + d

Daniel Lichtblau

答案 1 :(得分:3)

只是旁注。

当两个函数共享相同的参数,或者第二个函数的参数隐含在第一个函数中时,整个事情更有意义。

例如:

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

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

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

或类似

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

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

g[f, 3]
->6

g[f,2]
->2

答案 2 :(得分:2)

Daniel's answer是正确的 - 它可以回答您的问题!

但只是为了好玩,这里的内容更贴近您的问题。

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]]]

测试它:

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

定义另一个功能:

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

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

并给出第二个定义:

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

当然,你没有在f中向g[f_,d_]传递任何争论的事实(在大多数情况下)会使这类事情变得毫无意义......

答案 3 :(得分:2)

我也发现很难辨别你的意图,但这是我的解释:

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    *)

这样,g[f, x]返回一个函数,该函数将其参数传递给f

答案 4 :(得分:2)

在定义中

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

将a,b和c视为函数调用中的第一个第二个第三个参数,而不是符号{{1} },ab。与c类似,对f := (#1 + #2 + #3)&本身(不带参数)的调用不会产生预期的结果。

也许你想做这样的事情:

f

现在,f := a+b+c 被关联为fab的总和,它们是全局符号而不是函数参数。然后,

c

将提供f+d ,您可以使用a + b + c + d(或ReplaceAll)进行替换:

/.

给出f + d /. a->2x b+c+d+2x2 f2 (a+b+c)Sin[f]Sin[a+b+c]f-c等...