将纯函数传递给模块

时间:2012-01-12 12:44:30

标签: wolfram-mathematica

只是想检查一下是否可以安全执行以下操作:

假设我有一个函数'f(x)',它还取决于其他参数。例如,函数a*Exp[ (x-x0)^2/(2*std^2)]

在UI中,我读取了参数ax0以及std的用户输入值(通过滑块),然后我创建了一个纯函数变量

 f=Function[{x,a,x0,std}, a*Exp[ (x-x0)^2/(2*std^2)]

以上是在相同的上下文中(在Manipulate控制区域中),当我正在读取用户输入时,然后当用户点击按钮来运行程序时,我调用另一个较低级别的函数来处理此输入,像这样

 foo[f,a,x0,std]

然后在foo内部,通过调用这样的调用来评估f某些网格点(x1,x2等等)

 foo[f_,a_,x0,std_]:=Module[{x1,x2...},     
   .....
   f[x1,a,x0,std];
   f[x2,a,x0,std];
   f[x3,a,x0,std]; etc... 
   ....
   ]

请注意,在foo中,只使用纯函数的x参数,其余的只是为了骑行。

但是因为它们没有在foo中使用,所以我想不要传递所有其他参数a,x0,std。

所以,我将纯函数改为

 f=Function[{x}, a*Exp[ (x-x0)^2/(2*std^2)];

然后像这样叫foo

 foo[f]

然后在foo里面,我做

 foo[f_]:=Module[{},     
   .....
   f[x1];
   f[x2];
   f[x3]; etc...
   ....
   ]

我对此进行了测试,但它确实有效。 (起初我认为,因为模块foo中的上下文不同,我必须将a,x0,std与f一起传递。但我没有必要。看起来ax0和{ {1}}纯函数内部的值保存为全局变量并在纯函数体中传递。

我的问题:您认为上述第二种方法有什么问题吗?我忽视的东西?在我做过的测试中,它到目前为止工作正常。它会使它变得更简单,因为现在我只需要传递纯函数本身,而不是传递用于构建的所有其他参数,因为它们在foo中不需要。

换句话说,我试图在这两个设置之间做出决定:

enter image description here

想到检查一下。

感谢

1 个答案:

答案 0 :(得分:7)

这些方面的内容如何:

mkf[a_, x0_, std_] := 
 Function[{x}, Evaluate[a*Exp[(x - x0)^2/(2*std^2)]]]

foo[f_] := Module[{x},
      x = 1;
      f[x]
      ]

foo[mkf[1, 1, 1]]

在向前传递之前,您将生成要使用的功能。