问题标签 [unfold]

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 回答
1215 浏览

algorithm - 一棵懒惰的、广度优先的单子玫瑰树展开是否可能?

Data.Tree包含unfoldTreeM_BFunfoldForestM_BF函数使用单子动作的结果构建树的广度优先。使用森林展开器可以轻松编写树展开器,因此我将重点关注后者:

从种子列表开始,它对每个种子应用一个函数,生成将产生树根和种子的动作,以用于下一层展开。使用的算法有些严格,因此使用unfoldForestM_BFmonadIdentity与使用 pure 并不完全相同unfoldForest。我一直在试图弄清楚是否有办法让它变得懒惰而不牺牲它的O(n)时间限制。如果(正如 Edward Kmett 向我建议的那样)这是不可能的,我想知道是否可以用更受限制的类型来做到这一点,特别是要求MonadFix而不是Monad. 这里的概念是(以某种方式)设置指向未来计算结果的指针,同时将这些计算添加到待办事项列表中,因此如果它们在早期计算的影响中变得懒惰,它们将立即可用。

0 投票
2 回答
74 浏览

python - 在 Python 中根据自己的输出生成迭代列表

抱歉,这似乎是一个基本问题,但我在任何地方都找不到。在 Python 2 中,我想将一个 1 变量函数应用于其自己的输出,存储所有步骤的列表,即如果 f(x) 返回 x*x 然后从 2 迭代,我需要得到

[2, 4, 16, 256, 65536, ...]

理想情况下,我需要传入我的函数f、第一个输入1以及我想保留的迭代次数。

我想这在某种意义上与函数式编程相反reduce并且有点相似unfold

一个天真的方法是写

out = [2] for x in xrange(5): out.append(f(out[-1]))

什么是一个好的 Pythonic 方式来做到这一点?非常感谢你。

0 投票
1 回答
493 浏览

haskell - 对于未标记的树,“展开”的正确定义是什么?

我一直在考虑如何实现unfold以下类型的等价物:

这不是很明显,因为unfold列表的标准返回一个值和下一个种子。对于这种数据类型,它没有意义,因为在到达叶节点之前没有“值”。这样,只有返回新种子或以值停止才真正有意义。我正在使用这个定义:

虽然这似乎可行,但我不确定这是否应该是这样。所以,这就是问题:正确的方法是什么?

0 投票
1 回答
300 浏览

haskell - 奇怪的无法匹配类型错误

我有简单的一行功能:

它运作良好:

然后我想将展开器 lambda 提取为唯一函数:

现在,我有一个奇怪的错误:

0 投票
1 回答
430 浏览

performance - 展开器与 zipWith 的效率

在代码审查中,我回答了一个关于简单 Haskell fizzbuzz 解决方案的问题,提出了一种向前迭代的实现,避免了增加素数的二次成本并(几乎)完全丢弃模除法。这是代码:

作为进一步的提示,我建议使用Data.List.unfoldr. 该unfoldr版本是对这段代码的明显、简单的修改,所以我不会在这里输入它,除非寻求回答我的问题的人坚持认为这很重要(代码审查中的 OP 没有剧透)。unfoldr但我确实对解决方案与解决方案相比的相对效率有疑问zipWith。虽然我不再是 Haskell 新手,但我也不是 Haskell 内部结构方面的专家。

unfoldr解决方案不需要[start..]无限列表,因为它可以简单地从展开start。我的想法是

  1. zipWith解决方案不会按照[start..]要求记住每个连续的元素。每个元素都被使用和丢弃,因为没有保留对 [start..] 头部的引用。因此,那里消耗的内存并不比 with 多unfoldr
  2. 关于使其始终内联的性能和最近的补丁的担忧unfoldr是在我尚未达到的水平上进行的。

所以我认为两者在内存消耗上是相当的,但不知道相对性能。希望更多消息灵通的 Haskellers 可以引导我理解这一点。

unfoldr用于生成序列似乎是一件很自然的事情,即使其他解决方案更具表现力。我只知道我需要更多地了解它的实际性能。(出于某种原因,我发现foldr在那个层面上更容易理解)

注意unfoldr的使用Maybe是我遇到的第一个潜在的性能问题,甚至在我开始调查这个问题之前(也是我完全理解的唯一一点优化/内联讨论)。所以我能够立即停止担心Maybe(鉴于 Haskell 的最新版本)。

0 投票
1 回答
685 浏览

clojure - Clojure 有“展开”吗?

示例用法:

这个或类似的东西是否存在于clojure标准(或常用)库中?如果没有,有什么原因吗?我找到的最接近的是这篇博文:

http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure

0 投票
2 回答
1591 浏览

haskell - Haskell 中展开器类型的理由是什么?

文档中给出的示例unfoldr :: (b -> Maybe (a, b)) -> b -> [a]

可以很容易地用冗余对编写:

unfoldr需要这对做什么(a,b)?为什么它的类型不是(a -> Maybe a) -> a -> [a]

0 投票
1 回答
454 浏览

r - 生存分析中具有“展开”功能的 TCL 错误

我正在尝试使用unfoldpackage 中的功能RcmdrPlugin.survival。我使用了以下命令:

但是,R 正在返回以下错误消息:

结构错误(.External(.C_dotTcl, ...), class = "tclObj") : [tcl] wrong # args: 应该是 "winfo rootx window"。

我正在使用 R 版本 3.2.4。有什么建议么?

0 投票
2 回答
95 浏览

list - 自定义展开返回累加器

我正在尝试创建一个自定义展开函数,该函数返回其最后一个累加器值,例如:

我设法做到了以下几点:

但是我想避免List.rev生成结果列表并已经以正确的顺序生成它。我想有必要使用延续来构建列表,但我对函数式编程还很陌生,还没有设法将我的思想包裹在延续上;我能想象的所有替代方法都会将累加器放在结果列表中,或者不允许它由函数返回。

有没有办法做到这一点?

由于这是一个个人学习练习,我更喜欢一个解释如何做的答案,而不是简单地给出完整的代码。

0 投票
2 回答
304 浏览

haskell - 展开器中的 lambda 函数如何与 Haskell 中的两个参数一起使用?

阅读本文unfoldr时,我发现了使用函数生成斐波那契数列的示例:

但是当我查看文档时,我发现unfoldr函数中的 lambda 只需要一个参数b

文档中的示例也仅演示了一种参数用法:

所以,我很感兴趣如何将它应用于斐波那契示例中的两个参数?