说,我有一些功能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]
,但是没有用。
答案 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} },a
或b
。与c
类似,对f := (#1 + #2 + #3)&
本身(不带参数)的调用不会产生预期的结果。
也许你想做这样的事情:
f
现在,f := a+b+c
被关联为f
,a
和b
的总和,它们是全局符号而不是函数参数。然后,
c
将提供f+d
,您可以使用a + b + c + d
(或ReplaceAll
)进行替换:
/.
给出f + d /. a->2x
。 b+c+d+2x
会2 f
,2 (a+b+c)
会Sin[f]
,Sin[a+b+c]
会f-c
等...