问题标签 [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.
haskell - 重复动作的类型类,直到固定点
我注意到执行一个动作直到它停止产生某些效果的一种常见模式,当人们知道这表示一个固定点时(即,不可能有未来的效果)。有一个类型类吗?
这被 MonadFix 覆盖了吗?看代码,似乎是这样,但我被wiki 页面吓跑了“很容易看到‘递归’并猜测它意味着递归或重复执行动作。不。”
在我看来,固定点也像是身份的双重性。也就是说,当与非身份结合时,身份会消失(0 表示 (+),1 表示 (*),[] 表示追加等)。而固定点会导致任何非固定点在下面的“放松”操作下消失。有没有办法将这种二元性形式化,这样做有用吗?即,MonadPlus 和/或 Monoid 和 MonadRelax 之间是否存在关系?
最后,我注意到放松几乎是一种展开/变形。这样表达会更好吗?
f# - F# 中的定点组合器
这不起作用:
解决方案是添加一个额外的参数:
lazy
有没有办法使用and来做到这一点Lazy.force
?
haskell - Haskell:修复或不修复
我最近了解了Data.Function.fix
,现在我想在任何地方应用它。例如,每当我看到一个递归函数时,我都想“ fix
”它。所以基本上我的问题是我应该在何时何地使用它。
为了使其更具体:
1)假设我有以下代码分解n
:
如果我用 来重写它fix
,我会有所收获吗?丢东西?是否有可能通过将显式递归重写为fix
-version 我将解决或反之亦然创建堆栈溢出?
2) 处理列表时,有几种解决方案:递归/修复、foldr/foldl/foldl',可能还有其他方法。是否有关于何时使用每种方法的一般指南/建议?例如,你会用foldr
无限的素数列表重写上面的代码吗?
这里可能没有涉及其他重要问题。fix
也欢迎与使用相关的任何其他评论。
haskell - 类型论中 mu (μ) 绑定的范围
Haskell 中的列表可能如下所示:
类型理论解释是:
它将列表类型编码为仿函数的不动点。在 Haskell 中,这可以表示为:
我很好奇早期的 μ binder 的范围。绑定在外部范围内的名称可以在内部范围内保持可用吗?比如说,以下是一个有效的表达式:
...也许它与以下内容相同:
...但是当名称被重用时,事情会如何变化:
以上都是常规类型吗?
haskell - 对非函数类型进行“修复”的有用实例?
每次我用过fix :: (a -> a) -> a
,它一直在类型
对于一些a
和b
。实际上是否有一些应用程序的fix
类型参数没有实例化为函数类型,而不是像这样的微不足道的东西fix (const 0)
?将签名保留最一般的目的是什么?
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 。
haskell - Calculating fibonnacci numbers using fix
I am trying to understand how this factorial example works using the function fix :: (a -> a) -> a
.
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.
haskell - 代表性双函子的不动点
Edward Kmett 的实验性角色包提供了各种用于解除强制的实用程序,其中一些我已粘贴在本问题的末尾。包中的关键类是
给定类型
我希望写一些类似的东西
我相信以下应该有效,除了一个缺失的部分。我也有点担心,这bar
可能足够严格,以至于把所有东西都扔进一个无限循环。
点点滴滴roles
haskell - Haskell中的棘手阶乘
有没有一种方法可以使用以下函数在 Haskell 中创建函数来计算阶乘: