问题标签 [fixpoint-combinators]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
255 浏览

haskell - 重复动作的类型类,直到固定点

我注意到执行一个动作直到它停止产生某些效果的一种常见模式,当人们知道这表示一个固定点时(即,不可能有未来的效果)。有一个类型类吗?

这被 MonadFix 覆盖了吗?看代码,似乎是这样,但我被wiki 页面吓跑了“很容易看到‘递归’并猜测它意味着递归或重复执行动作。不。”

在我看来,固定点也像是身份的双重性。也就是说,当与非身份结合时,身份会消失(0 表示 (+),1 表示 (*),[] 表示追加等)。而固定点会导致任何非固定点在下面的“放松”操作下消失。有没有办法将这种二元性形式化,这样做有用吗?即,MonadPlus 和/或 Monoid 和 MonadRelax 之间是否存在关系?

最后,我注意到放松几乎是一种展开/变形。这样表达会更好吗?

0 投票
1 回答
601 浏览

f# - F# 中的定点组合器

这不起作用:

解决方案是添加一个额外的参数:

lazy有没有办法使用and来做到这一点Lazy.force

0 投票
4 回答
971 浏览

haskell - Haskell:修复或不修复

我最近了解了Data.Function.fix,现在我想在任何地方应用它。例如,每当我看到一个递归函数时,我都想“ fix”它。所以基本上我的问题是我应该在何时何地使用它。

为了使其更具体:

1)假设我有以下代码分解n

如果我用 来重写它fix,我会有所收获吗?丢东西?是否有可能通过将显式递归重写为fix-version 我将解决或反之亦然创建堆栈溢出?

2) 处理列表时,有几种解决方案:递归/修复、foldr/foldl/foldl',可能还有其他方法。是否有关于何时使用每种方法的一般指南/建议?例如,你会用foldr无限的素数列表重写上面的代码吗?

这里可能没有涉及其他重要问题。fix也欢迎与使用相关的任何其他评论。

0 投票
2 回答
559 浏览

haskell - 类型论中 mu (μ) 绑定的范围

Haskell 中的列表可能如下所示:

类型理论解释是:

它将列表类型编码为仿函数的不动点。在 Haskell 中,这可以表示为:

我很好奇早期的 μ binder 的范围。绑定在外部范围内的名称可以在内部范围内保持可用吗?比如说,以下是一个有效的表达式:

...也许它与以下内容相同:

...但是当名称被重用时,事情会如何变化:

以上都是常规类型吗?

0 投票
4 回答
927 浏览

scheme - 什么是固定点?

我正在重看一些早期关于SICP的讲座。定点的概念让我有点困惑。定点过程:我是否应该这样想,“这是找到给定函数的不动点的方法。” 所以给f(2) = 2

另外,为什么在本讲座y中指出,映射到的新函数x / y是一个固定点?

0 投票
3 回答
169 浏览

haskell - 对非函数类型进行“修复”的有用实例?

每次我用过fix :: (a -> a) -> a,它一直在类型

对于一些ab。实际上是否有一些应用程序的fix类型参数没有实例化为函数类型,而不是像这样的微不足道的东西fix (const 0)?将签名保留最一般的目的是什么?

0 投票
2 回答
499 浏览

f# - 为什么 F# 编译器不为此函数创建尾调用?

我在使用 F# 中的定点组合器时遇到问题:

(这段代码只是为了演示问题,它是专门写的,以便生成的IL代码易于阅读。)

这段代码——当编译时启用了优化和尾调用——会导致StackOverflowException. 我查看了 IL 代码,可以将问题追溯到调用中的 lambda fix

(我稍微修改了代码,以便于阅读。)

的原因StackOverflowException是调用body没有尾调用(callvirt底部的指令)。原因是编译器创建了对实际返回的 lambda 的调用Unit

所以用 C# 术语来说:Body 是Func<Int32,Unit>它真正应该是Action<Int32>. 由于调用返回的东西必须被丢弃,所以它不能是尾调用。另请注意,该方法f@1被编译为void,而不是Unit,这就是必须丢弃调用参数的结果的原因。

这实际上是有意的还是我可以做些什么?编译器处理这个 lambda 的方式使得定点组合器对于我打算使用它的所有目的都无用。


我只想补充一点,只要您返回一些结果,它就可以正常工作。只有不返回任何内容的函数才能按预期工作。

这有效:

现在这是为 lambda 生成的代码:

现在有一个尾声。一切正常。


IL代码fix(用于评论中的讨论):

所以在我看来(fix f),fix 的定义内部并不是此时发生的递归调用,而只是对fix自身的引用——连同参数f——被存储到一个被调用的闭包Program/fix@11中并传递给 lambda作为一个参数,然后fix通过这个闭包实际调用。

否则,这将是从一开始就无限递归并且fix毫无用处。

我正在使用 F# 版本 3.1.2,F# Interactive 版本 12.0.30815.0


请:

我对替代解决方案不感兴趣。我只想知道为什么Unit当 lambda 不产生结果时编译器会返回需要丢弃的 a 。

0 投票
2 回答
98 浏览

haskell - Calculating fibonnacci numbers using fix

I am trying to understand how this factorial example works using the function fix :: (a -> a) -> a.

Example:

I do not see why fix factabs has this type... fix expects a function of type a -> a, how can we apply it to a function of type (a -> a) -> a -> a (a function that takes two parameters)? I am totally confused...

Basically I was trying to figure out how to convert the function limit below to something that uses fix. Would appreciate any help.

0 投票
1 回答
110 浏览

haskell - 代表性双函子的不动点

Edward Kmett 的实验性角色包提供了各种用于解除强制的实用程序,其中一些我已粘贴在本问题的末尾。包中的关键类是

给定类型

我希望写一些类似的东西

我相信以下应该有效,除了一个缺失的部分。我也有点担心,这bar可能足够严格,以至于把所有东西都扔进一个无限循环。

点点滴滴roles

0 投票
2 回答
328 浏览

haskell - Haskell中的棘手阶乘

有没有一种方法可以使用以下函数在 Haskell 中创建函数来计算阶乘: