问题标签 [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.
algorithm - 一棵懒惰的、广度优先的单子玫瑰树展开是否可能?
Data.Tree
包含unfoldTreeM_BF
和unfoldForestM_BF
函数使用单子动作的结果构建树的广度优先。使用森林展开器可以轻松编写树展开器,因此我将重点关注后者:
从种子列表开始,它对每个种子应用一个函数,生成将产生树根和种子的动作,以用于下一层展开。使用的算法有些严格,因此使用unfoldForestM_BF
monadIdentity
与使用 pure 并不完全相同unfoldForest
。我一直在试图弄清楚是否有办法让它变得懒惰而不牺牲它的O(n)
时间限制。如果(正如 Edward Kmett 向我建议的那样)这是不可能的,我想知道是否可以用更受限制的类型来做到这一点,特别是要求MonadFix
而不是Monad
. 这里的概念是(以某种方式)设置指向未来计算结果的指针,同时将这些计算添加到待办事项列表中,因此如果它们在早期计算的影响中变得懒惰,它们将立即可用。
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 方式来做到这一点?非常感谢你。
haskell - 对于未标记的树,“展开”的正确定义是什么?
我一直在考虑如何实现unfold
以下类型的等价物:
这不是很明显,因为unfold
列表的标准返回一个值和下一个种子。对于这种数据类型,它没有意义,因为在到达叶节点之前没有“值”。这样,只有返回新种子或以值停止才真正有意义。我正在使用这个定义:
虽然这似乎可行,但我不确定这是否应该是这样。所以,这就是问题:正确的方法是什么?
haskell - 奇怪的无法匹配类型错误
我有简单的一行功能:
它运作良好:
然后我想将展开器 lambda 提取为唯一函数:
现在,我有一个奇怪的错误:
performance - 展开器与 zipWith 的效率
在代码审查中,我回答了一个关于简单 Haskell fizzbuzz 解决方案的问题,提出了一种向前迭代的实现,避免了增加素数的二次成本并(几乎)完全丢弃模除法。这是代码:
作为进一步的提示,我建议使用Data.List.unfoldr
. 该unfoldr
版本是对这段代码的明显、简单的修改,所以我不会在这里输入它,除非寻求回答我的问题的人坚持认为这很重要(代码审查中的 OP 没有剧透)。unfoldr
但我确实对解决方案与解决方案相比的相对效率有疑问zipWith
。虽然我不再是 Haskell 新手,但我也不是 Haskell 内部结构方面的专家。
unfoldr
解决方案不需要[start..]
无限列表,因为它可以简单地从展开start
。我的想法是
- 该
zipWith
解决方案不会按照[start..]
要求记住每个连续的元素。每个元素都被使用和丢弃,因为没有保留对 [start..] 头部的引用。因此,那里消耗的内存并不比 with 多unfoldr
。 - 关于使其始终内联的性能和最近的补丁的担忧
unfoldr
是在我尚未达到的水平上进行的。
所以我认为两者在内存消耗上是相当的,但不知道相对性能。希望更多消息灵通的 Haskellers 可以引导我理解这一点。
unfoldr
用于生成序列似乎是一件很自然的事情,即使其他解决方案更具表现力。我只知道我需要更多地了解它的实际性能。(出于某种原因,我发现foldr
在那个层面上更容易理解)
注意:unfoldr
的使用Maybe
是我遇到的第一个潜在的性能问题,甚至在我开始调查这个问题之前(也是我完全理解的唯一一点优化/内联讨论)。所以我能够立即停止担心Maybe
(鉴于 Haskell 的最新版本)。
clojure - Clojure 有“展开”吗?
示例用法:
这个或类似的东西是否存在于clojure标准(或常用)库中?如果没有,有什么原因吗?我找到的最接近的是这篇博文:
http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure
haskell - Haskell 中展开器类型的理由是什么?
文档中给出的示例unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
:
可以很容易地用冗余对编写:
unfoldr
需要这对做什么(a,b)
?为什么它的类型不是(a -> Maybe a) -> a -> [a]
?
r - 生存分析中具有“展开”功能的 TCL 错误
我正在尝试使用unfold
package 中的功能RcmdrPlugin.survival
。我使用了以下命令:
但是,R 正在返回以下错误消息:
结构错误(.External(.C_dotTcl, ...), class = "tclObj") : [tcl] wrong # args: 应该是 "winfo rootx window"。
我正在使用 R 版本 3.2.4。有什么建议么?
list - 自定义展开返回累加器
我正在尝试创建一个自定义展开函数,该函数返回其最后一个累加器值,例如:
我设法做到了以下几点:
但是我想避免List.rev
生成结果列表并已经以正确的顺序生成它。我想有必要使用延续来构建列表,但我对函数式编程还很陌生,还没有设法将我的思想包裹在延续上;我能想象的所有替代方法都会将累加器放在结果列表中,或者不允许它由函数返回。
有没有办法做到这一点?
由于这是一个个人学习练习,我更喜欢一个解释如何做的答案,而不是简单地给出完整的代码。