问题标签 [tying-the-knot]
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 - 你如何在 Haskell 中构建一个无限网格的数据结构?
我试图通过打结来形成一个无限网格状的数据结构。
这是我的方法:
由于某种原因,这不起作用。如此处所示:
我哪里错了?
haskell - 修补不带 < 的递归定义列表>
语境
我们都知道递归定义的斐波那契数列:
问题
我正在尝试在几个地方“修补”它,以便:
- 一般递归方程“元素是两个先前元素的和”成立,但是
- 对于单个元素的值,可以有可数的例外。
我在哪里
效用
为此,我将定义以下函数来修改列表中的特定元素:
我可以用它来改变自然的顺序:
补丁后
到目前为止,一切都很好。现在修补斐波那契数列:
这满足要求 (2)。
完整补丁
为了也得到 (1),我将用更明确的 tie-the-knot 样式重写定义:
没有补丁,它仍然可以按预期工作:
我现在可以修补我想要的元素并保留递归定义:
局限性
但我可以吗?
问题
怎么了?
直观地说,数据流似乎是健全的。每个列表元素都应该有一个不涉及循环的正确定义。我的意思是,对于 no-patch 来说已经足够了fibs
;修补只应该使它更明确。
所以我可能错过了一些东西。我的功能有一些严格性问题patch
吗?其他地方的一些严格问题?完全不同的东西?
haskell - 双递归定义列表的双重无限列表
语境
前几天我询问了如何修补递归定义的列表。我现在正试图通过对 2D 列表(列表列表)进行操作来提升它的水平。
我将以帕斯卡三角形为例,例如这个美丽的三角形:
问题
我想这样表达:
我将使用我自己的第一行和第一列(上面的示例假设第一行是
repeat 1
,这是可以修复的,而第一列是repeat (head (head pascals))
,这将更加棘手)每个元素仍然是上面一个元素和它左边一个元素的函数。
作为一个整体,它本身就是一个函数,足以在定义中插入一个补丁函数并让它传播补丁。
所以从外面看,我想找到一个f
可以这样定义的函数pascal
:
...所以这pascal id
与示例中的相同,并pascal (patch (1,3) to 16)
产生如下内容:
我在哪里
让我们首先定义并提取第一行和第一列,这样我们就可以让它们可用,而不会试图滥用它们的内容。
更新要使用的定义row0
很容易:
但第一列仍然是element0
. 更新以从以下位置获取它们col0
:
现在我们可以满足第一个要求(自定义第一行和第一列)。没有补丁,第二个还是不错的。
我们甚至得到了第三部分的一部分:如果我们修补一个元素,它会向下传播,因为它newRow
是根据prevRow
. 但它不会向右传播,因为(+)
操作在scanl
的内部累加器和 fromleftMost
上,这在这种情况下是显式的。
我试过的
从那里开始,似乎正确的做法是真正分离关注点。我们希望我们的初始化程序在定义row0
中col0
尽可能明确,并找到一种方法来独立定义矩阵的其余部分。存根:
然后我们希望直接根据整体定义余数。自然的定义是:
第一行出来很好。为什么是循环?评估后有帮助: pascals
被定义为一个缺点,他的车很好(并且打印)。什么是cdr?是zipWith (:) (tail col0) remainder
。这个表达式是 a[]
还是(:)
?它是其论点中最短的,tail col0
并且remainder
. 是无限的,它与, iecol0
一样为空。那是还是?好吧,已经评估为,但尚未找到 WHNF。我们已经在尝试,所以。remainder
zipWith genRow pascals (tail pascals)
[]
(:)
pascals
(:)
(tail pascals)
<<loop>>
(很抱歉用单词拼写出来,但我真的不得不像这样在脑海中追踪它才能第一次理解它)。
出路?
根据我的定义,似乎所有定义都是正确的,数据流明智的。循环现在看起来很简单,因为评估器无法确定生成的结构是否是有限的。我找不到办法让它成为一个承诺“它是无限的”。
我觉得我需要一些惰性匹配的逆向:一些惰性返回,我可以告诉评估者这个 WHNF 出来(:)
,但你仍然需要稍后调用这个 thunk 来找出其中的内容。
它仍然感觉像是一个固定点,但我还没有设法以一种有效的方式表达。
haskell - 水平顺序 repminPrint
repmin
问题是众所周知的。我们得到了树的数据类型:
我们需要编写一个函数 down( ) ,它将获取一棵数字树,并在一次传递repmin
中将其中的所有数字替换为它们的最小值。也可以沿途打印树(假设函数执行此操作)。使用值递归可以很容易地写下前序、后序和有序。以下是 in-order 的示例:repminPrint
repmin
repminPrint
repminPrint
但是如果我们想写下level-orderrepminPrint
怎么办?
我的猜测是我们不能使用队列,因为我们需要ml
和mr
更新绑定m
。我看不出这怎么会因队列而下降。我写了一个 level-order 的实例Foldable Tree
来说明我的意思:
如您所见,我们在当前递归调用期间l
和期间不运行任何东西。r
那么,这怎么可能呢?我希望得到提示而不是完整的解决方案。
haskell - repmin 如何在 Haskell 的树中放置值?
我真的很喜欢这个repmin
问题:
写下
repmin :: Tree Int -> Tree Int
,它在一次通过中将树中的所有数字替换为它们的最小值。
如果我在 python 中编写这样的东西,我会通过引用传递值(假设单元素列表而不是数字就足够了):
在我看来,这似乎是一种合适的方式来围绕 Haskell 中的打结解决方案(我从 为玫瑰树Data.Tree
写了这个):
然而,我认为解决方案的工作方式非常不同。以下是我对后一种的理解:
让我们重写loop
一下(->)
:
我认为它与loop
for(->)
的工作相似,因为snd
它给出了与let
.
因此,当repmin
遍历树时,它是:
- 在树中建立最小值,作为该对的第二个元素返回。
snd $ copyRose (tree, m)
在每个节点中留下。
因此,当遍历结束时,程序知道snd $ copyRose (tree, m)
(即树中的最小值)的值,并且能够在计算树的某个节点时显示它。
我repmin
在 Haskell 中理解正确吗?
rxjs - 如何在 Rx.Net 中使用 iteself 递归地执行打结/定义 observable?
有时,业务逻辑似乎能够通过一些递归定义的 observables 进行自然建模。这是一个例子:
对于用户输入的每个命令,它应该在 proccess 中触发正在运行的进程,或者在 skippedCommands 中发出一个值。这种逻辑的一些直接翻译可能
如上面的代码所示,assign ofvalidCommands
和processes
是相互递归的,我们可以等效地定义processes
直接使用自身递归
但是我们不能prcesses
像这样在 C# 中定义 Observable。
我发现了几个可能相关的事情:
Observable.Generate
构造函数。但是,它似乎以同步方式折叠自己的状态,我不知道如何使用userCommands
observable 和RunCommand
inObservable.Generate
;RxJS 中的一些操作符
exhaust
,exhaustMap
虽然 Rx.Net 没有提供这个操作符,但是有一些第三方库提供了这些操作符,比如FSharp.Control.Reactive。实现类似于
但是,有两个问题。一个。直接使用此运算符不符合上述要求,跳过的命令将被忽略。我们可以稍微修改源代码以适应要求,但还有另一个问题 b. 该实现引入了两个局部可变变量和两个嵌套订阅。我不知道这在所有情况下是否都可以(会有数据竞争的风险吗?),并且更喜欢基于操作符组合而不是可变引用的解决方案
SodiumFRP提供了前向引用类型
StreamLoop
和CellLoop
. 根据功能响应式编程一书,这些前向引用类型的 Rx 替代方案将是Subject
,通过使用Subject
上面的递归构造,将其分为两个阶段。问题是由 Intro to Rx 指出的,使用Subject
需要手动管理更多状态,至少需要 dispose 主题,并且可能被迫使用 hot observables。我想知道是否存在不使用的解决方案Subject
在结果的最后一个值上使用
window
带边界的运算符(就在完成之前)RunCommand
,processes
上面可以构造一些方法,但是这个解决方案需要使用两次结束信号,这需要仔细处理(在尝试和调整时安静一段时间Take(1)
,,,,,重载操作员获得预期结果)同时发生的事件。zip
withLatestFrom
combineLatest
Window
是否有更好的解决方案或对上述解决方案的修改,尤其是仅使用运算符?
haskell - 我怎样才能避免<> 在哈斯克尔?
下面的程序导致<<loop>>
GHC。
...明显地。事后看来。
发生这种情况是因为walk
正在计算一个固定点,但有多个可能的固定点。当列表推导到达图形遍历的末尾时,它“询问” ; 的下一个元素answer
。但这正是它已经在尝试计算的。我想我认为程序会到达列表的末尾,然后停止。
我不得不承认,我对这段漂亮的代码有点感伤,希望我能让它工作。
我应该怎么做?
我如何预测“打结”(指表达式中的值,说明如何计算值)是一个坏主意?