将纯函数传递给模块

Nas*_*ser 1 wolfram-mathematica

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

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

从UI我读这些参数的用户输入值(通过滑块)ax0std,然后我使纯函数变量

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

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

 foo[f,a,x0,std]
Run Code Online (Sandbox Code Playgroud)

然后在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... 
   ....
   ]
Run Code Online (Sandbox Code Playgroud)

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

但由于它们没有在foo中使用,我想不要传递所有其他参数a,x0,std.

所以,我改变了纯粹的功能

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

然后像这样叫foo

 foo[f]
Run Code Online (Sandbox Code Playgroud)

然后在里面,我做

 foo[f_]:=Module[{},     
   .....
   f[x1];
   f[x2];
   f[x3]; etc...
   ....
   ]
Run Code Online (Sandbox Code Playgroud)

我测试了这个,它有效.(起初我以为,因为背景是不同的模块内富,我必须通过a,x0,std使用f一起,但我没有给.看来a,x0stdx纯函数内部值保存为全局变量,并通过在纯函数体.

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

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

在此输入图像描述

只是想检查一下.

谢谢

小智 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]]
Run Code Online (Sandbox Code Playgroud)

您在向前传递之前生成要使用的功能.

  • +1 - 我会这样做(生成一个带有嵌入常量的闭包).但有一件事:既然你使用`Evaluate`(这里不是严格需要的),只有将`x`重命名为`x $`,由(推测)`SetDelayed/RuleDelayed`完成,在函数中保存`x`来自意外碰撞的身体与'x`的可能的全球价值.(例如这里发生:`x = 1;函数[{x},评估[a*Exp [(x-x0)^ 2 /(2*std ^ 2)]]]`).我不知道在这种情况下我们是否总能指望重命名方案,但一个简单的保护措施是将`mkf`的rhs包装成`Block [{x},...]`. (2认同)