问题标签 [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.

0 投票
2 回答
556 浏览

haskell - 你如何在 Haskell 中构建一个无限网格的数据结构?

我试图通过打结来形成一个无限网格状的数据结构。

这是我的方法:

由于某种原因,这不起作用。如此处所示:

我哪里错了?

0 投票
1 回答
123 浏览

haskell - 修补不带 < 的递归定义列表>

语境

我们都知道递归定义的斐波那契数列

问题

我正在尝试在几个地方“修补”它,以便:

  1. 一般递归方程“元素是两个先前元素的和”成立,但是
  2. 对于单个元素的值,可以有可数的例外。

我在哪里

效用

为此,我将定义以下函数来修改列表中的特定元素:

我可以用它来改变自然的顺序:

补丁后

到目前为止,一切都很好。现在修补斐波那契数列:

这满足要求 (2)。

完整补丁

为了也得到 (1),我将用更明确的 tie-the-knot 样式重写定义:

没有补丁,它仍然可以按预期工作:

我现在可以修补我想要的元素并保留递归定义:

局限性

但我可以吗?

问题

怎么了?

直观地说,数据流似乎是健全的。每个列表元素都应该有一个不涉及循环的正确定义。我的意思是,对于 no-patch 来说已经足够了fibs;修补只应该使它明确。

所以我可能错过了一些东西。我的功能有一些严格性问题patch吗?其他地方的一些严格问题?完全不同的东西?

0 投票
2 回答
189 浏览

haskell - 双递归定义列表的双重无限列表

语境

前几天我询问了如何修补递归定义的列表。我现在正试图通过对 2D 列表(列表列表)进行操作来提升它的水平。

我将以帕斯卡三角形为例,例如这个美丽的三角形:

问题

我想这样表达:

  1. 我将使用我自己的第一行和第一列(上面的示例假设第一行是repeat 1,这是可以修复的,而第一列是repeat (head (head pascals)),这将更加棘手)

  2. 每个元素仍然是上面一个元素和它左边一个元素的函数。

  3. 作为一个整体,它本身就是一个函数,足以在定义中插入一个补丁函数并让它传播补丁。

所以从外面看,我想找到一个f可以这样定义的函数pascal

...所以这pascal id与示例中的相同,并pascal (patch (1,3) to 16)产生如下内容:

我在哪里

让我们首先定义并提取第一行和第一列,这样我们就可以让它们可用,而不会试图滥用它们的内容。

更新要使用的定义row0很容易:

但第一列仍然是element0. 更新以从以下位置获取它们col0

现在我们可以满足第一个要求(自定义第一行和第一列)。没有补丁,第二个还是不错的。

我们甚至得到了第三部分的一部分:如果我们修补一个元素,它会向下传播,因为它newRow是根据prevRow. 但它不会向右传播,因为(+)操作在scanl的内部累加器和 fromleftMost上,这在这种情况下是显式的。

我试过的

从那里开始,似乎正确的做法是真正分离关注点。我们希望我们的初始化程序在定义row0col0尽可能明确,并找到一种方法来独立定义矩阵的其余部分。存根:

然后我们希望直接根据整体定义余数。自然的定义是:

第一行出来很好。为什么是循环?评估后有帮助: pascals被定义为一个缺点,他的车很好(并且打印)。什么是cdr?是zipWith (:) (tail col0) remainder。这个表达式是 a[]还是(:)?它是其论点中最短的,tail col0并且remainder. 是无限的,它与, iecol0一样为空。那是还是?好吧,已经评估为,但尚未找到 WHNF。我们已经在尝试,所以。remainder zipWith genRow pascals (tail pascals)[](:)pascals(:)(tail pascals)<<loop>>

(很抱歉用单词拼写出来,但我真的不得不像这样在脑海中追踪它才能第一次理解它)。

出路?

根据我的定义,似乎所有定义都是正确的,数据流明智的。循环现在看起来很简单,因为评估器无法确定生成的结构是否是有限的。我找不到办法让它成为一个承诺“它是无限的”。

我觉得我需要一些惰性匹配的逆向:一些惰性返回,我可以告诉评估者这个 WHNF 出来(:),但你仍然需要稍后调用这个 thunk 来找出其中的内容。

它仍然感觉像是一个固定点,但我还没有设法以一种有效的方式表达。

0 投票
1 回答
87 浏览

haskell - 水平顺序 repminPrint

repmin问题是众所周知的。我们得到了树的数据类型:

我们需要编写一个函数 down( ) ,它将获取一棵数字树,并在一次传递repmin中将其中的所有数字替换为它们的最小值。也可以沿途打印树(假设函数执行此操作)。使用值递归可以很容易地写下前序、后序和有序。以下是 in-order 的示例:repminPrintrepminrepminPrintrepminPrint

但是如果我们想写下level-orderrepminPrint怎么办?

我的猜测是我们不能使用队列,因为我们需要mlmr更新绑定m。我看不出这怎么会因队列而下降。我写了一个 level-order 的实例Foldable Tree来说明我的意思:

如您所见,我们在当前递归调用期间l和期间不运行任何东西。r

那么,这怎么可能呢?我希望得到提示而不是完整的解决方案。

0 投票
1 回答
140 浏览

haskell - repmin 如何在 Haskell 的树中放置值?

我真的很喜欢这个repmin问题:

写下repmin :: Tree Int -> Tree Int,它在一次通过中将树中的所有数字替换为它们的最小值。

如果我在 python 中编写这样的东西,我会通过引用传递值(假设单元素列表而不是数字就足够了):

在我看来,这似乎是一种合适的方式来围绕 Haskell 中的打结解决方案(我从 为玫瑰树Data.Tree写了这个):

然而,我认为解决方案的工作方式非常不同。以下是我对后一种的理解:

让我们重写loop一下(->)

我认为它与loopfor(->)的工作相似,因为snd它给出了与let.

因此,当repmin遍历树时,它是:

  • 在树中建立最小值,作为该对的第二个元素返回。
  • snd $ copyRose (tree, m)在每个节点中留下。

因此,当遍历结束时,程序知道snd $ copyRose (tree, m)(即树中的最小值)的值,并且能够在计算树的某个节点时显示它。

repmin在 Haskell 中理解正确吗?

0 投票
1 回答
54 浏览

rxjs - 如何在 Rx.Net 中使用 iteself 递归地执行打结/定义 observable?

有时,业务逻辑似乎能够通过一些递归定义的 observables 进行自然建模。这是一个例子:

对于用户输入的每个命令,它应该在 proccess 中触发正在运行的进程,或者在 skippedCommands 中发出一个值。这种逻辑的一些直接翻译可能

如上面的代码所示,assign ofvalidCommandsprocesses是相互递归的,我们可以等效地定义processes直接使用自身递归

但是我们不能prcesses像这样在 C# 中定义 Observable。

我发现了几个可能相关的事情:

  1. Observable.Generate构造函数。但是,它似乎以同步方式折叠自己的状态,我不知道如何使用userCommandsobservable 和RunCommandin Observable.Generate

  2. RxJS 中的一些操作符exhaustexhaustMap虽然 Rx.Net 没有提供这个操作符,但是有一些第三方库提供了这些操作符,比如FSharp.Control.Reactive。实现类似于

但是,有两个问题。一个。直接使用此运算符不符合上述要求,跳过的命令将被忽略。我们可以稍微修改源代码以适应要求,但还有另一个问题 b. 该实现引入了两个局部可变变量和两个嵌套订阅。我不知道这在所有情况下是否都可以(会有数据竞争的风险吗?),并且更喜欢基于操作符组合而不是可变引用的解决方案

  1. SodiumFRP提供了前向引用类型StreamLoopCellLoop. 根据功能响应式编程一书,这些前向引用类型的 Rx 替代方案将是Subject,通过使用Subject上面的递归构造,将其分为两个阶段。问题是由 Intro to Rx 指出的,使用Subject需要手动管理更多状态,至少需要 dispose 主题,并且可能被迫使用 hot observables。我想知道是否存在不使用的解决方案Subject

  2. 在结果的最后一个值上使用window带边界的运算符(就在完成之前)RunCommandprocesses上面可以构造一些方法,但是这个解决方案需要使用两次结束信号,这需要仔细处理(在尝试和调整时安静一段时间Take(1),,,,,重载操作员获得预期结果)同时发生的事件。zipwithLatestFromcombineLatestWindow

是否有更好的解决方案或对上述解决方案的修改,尤其是仅使用运算符?

0 投票
2 回答
159 浏览

haskell - 我怎样才能避免<> 在哈斯克尔?

下面的程序导致<<loop>>GHC。

...明显地。事后看来。

发生这种情况是因为walk正在计算一个固定点,但有多个可能的固定点。当列表推导到达图形遍历的末尾时,它“询问” ; 的下一个元素answer。但这正是它已经在尝试计算的。我想我认为程序会到达列表的末尾,然后停止。

我不得不承认,我对这段漂亮的代码有点感伤,希望我能让它工作。

  • 我应该怎么做?

  • 我如何预测“打结”(指表达式中的值,说明如何计算值)是一个坏主意?