- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我认为这不能称为“定点递归”,因为它太简单了。然而,我最近意识到它实际上可能是。
我是否有效地实现了定点递归?
这里是有问题的函数:
/* recursive kleisli fold */
var until = function(f) {
return function(a) {
return kleisli(f, until(f))(a);
};
};
这里有一些额外的上下文:
// The error monad's bind
var bind_ = function(f, m) { return m.m === Success ? f(m.a) : m; };
var bind = function(f, m) {
return m !== undefined && m.m !== undefined && m.a !== undefined ? bind_(f, m) : m;
};
var kleisli = function(f1, f2) {
return function(a) {
return bind(f2, f1(a));
};
};
剩下的代码是here ,但上面的代码片段应该足以跟进。
最佳答案
定点组合器的定义是一个函数F
,它接受一个函数f
并返回一个函数p
,这样
给定 F(f) = p
然后 p = f(p)
可以编写许多可能的定点组合器。不要因为直截了当而认为某物不是定点组合器;这是 JavaScript 中的标准定义,非常简单:
var fix = function(f) {
return function(x) {
return f(fix(f))(x)
}
};
一个用法可能是计算阶乘的定点,使用:
var fact = function(f) {
return function(n) { return (n == 0) ? 1 : (n * f(n - 1)) }
};
alert(fix(fact)(7)); // alerts us with 5040.
有关不同定点组合器(Y 组合器)的示例,请参阅 this helpful blog post .
让我们看看您的 until
组合器是否计算定点。由于您正在使用 monadic 函数,因此定点定义略有变化以处理 monadic 结构,其中 F
是一个(monadic)定点组合器,当
给定 F(f) = p
然后 p = f* 。 p
其中 f* 。 p
表示函数 p
与函数 f
的 Kleisli 组合(在您的代码中,您将编写此 kleisli(p, f)
,您可以将 *
视为 bind
)。我将使用这种表示法,因为它比编写 JavaScript 更短。
然后让我们展开 until
的定义,看看我们得到了什么:
until(f) = (until(f))* . f
= (until(f)* . f)* . f
= ((... . f)* . f)* . f
= ... . f* . f* . f (associativity of bind for a monad: (g* . f)* = g* . f*)
= p
是否 p = f* 。 p
?
... . f* . f* . f =?= f* . ... . f* . f* . f
是的-我相信是这样。虽然我不认为这是一个有用的固定点。 (恐怕我对此还没有很好的论据 - 但我认为这基本上是一个最大的固定点,它只会发散)。
在我看来,until
中 kleisli
的参数似乎应该被交换。也就是说,我们希望在 fix
示例中执行 Kleisli 等效应用程序,因此我们需要将递归调用 until(f)
的单子(monad)结果传递给 f
:
var until = function(f) {
return function(a) {
return kleisli(until(f), f)(a);
};
};
让我们展开 until
的新定义:
until(f) = f* . until(f)
= f* . (f* . until(f))
= f* . f* . ...
= p
是否 p = f* 。 p
?是的:
f* . f* ... = f* . (f* . f* . ...)
因为将 f* 的另一个组合添加到 f* 组合的无限链上是相同的函数。
使用您的 kleisli
函数我遇到了一些发散问题(一些评估发生得太快,所以计算一直运行到我用完堆栈空间为止)。相反,以下内容似乎对我有用:
var until = function(f) {
return function(a) {
return bind(f,until(f)(a));
};
};
有关单子(monad)代码定点的更多信息,您可能想查看 the work of Erkök and Launchbury .
关于javascript - 这是定点组合器的实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17821019/
当我在定点 Z3Py 中启用解释生成选项时,我收到包含以下消息的核心转储。 Error setting 'DL_GENERATE_EXPLANATIONS', reason: unknown opti
我正在开发一些代码,可以从 HW 获取浮点或定点数据。目前我们将其作为 float 。 底层API都是定点的。所以我们必须将数据作为定点传回。我们使用的算法是 Cholesky。我想知道为什么我们必须
我有一个关于在 MATLAB 中为 Texas Instruments TMS320C64xx DSP 编写算法的问题: 我在 MATLAB 中草率地实现了我的过滤器。我的目标是使用 MATLAB E
我需要将 float 转换为Q31定点,Q31表示1个符号位,0位表示整数部分,31位表示小数部分。这意味着 Q31 只能表示 [-1,0.9999] 范围内的数字。 根据定义,从浮点转换为定点时,会
我正在使用第 3 方定点 antilog() 函数来计算分贝 out_mag = 10^( in_db/20 ) 的幅度。 antilog() 采用 Q6.25 格式作为输入,并在输出时提供 Q16.
我想将一个定点数(Q31/int32 表示具有 31 个小数位的小数)除以另一个 Q31/int32。我想计算z = y/x,知道abs(x)>abs(y)。因此,z<1,因此可以表示为另一个Q31/
我是一名优秀的程序员,十分优秀!