问题标签 [recursive-type]

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

f# - 试图让绑定为状态和延迟单子的组合工作

如果这个问题的答案是“你做错了”,一定要让我知道一个更合适的方法。我的代码结构如下:

现在这种类型主要是直接使用的,有很多内联代码进行手动绑定,这是我试图摆脱的很多样板,所以我想我把它变成一个计算表达式。正确获取mapbindapply并不难。

State 是通过 DC 进行的,但是这样做很麻烦,所以我将其更改为以下内容,这是我在与 state monad 讨论中看到的常见签名。

然后我决定把它提升到一个新的水平并引入延迟单子(或最终或任何它的名字)。所以我改变了我的类型,使其递归:

我尝试了以下一些变体,但不断得到:

当统一 ''a' 和 'Res<'a> -> Res<'b>' 时,结果类型将是无限的

(通常在我不调用return时发生,即Res.E <|以下)

或者我似乎无法正确输入类型,以下(可以理解)引发类型错误,但我有一个盲点来修复它:

此表达式应具有类型“Res<'a>”,但此处具有类型“DC * Res<'a>”。

我知道签名应该是('a -> Res<'b>) -> Res<'a> -> XRes<'b>. 问题来自正确的递归,至少在我的脑海中。我什至不确定为什么要将结果提供给Res.E,据我所知,k延续应该已经返回这种类型。

另外,我目前的回报如下(跟随史蒂夫霍斯菲尔德):

但在一些帖子(特别是热闹的 Frankenfunctor )中也注意到了这一点:

也许我遵循了我不应该遵循的模式,但当时这似乎是个好主意,尤其是在尝试重构大量样板代码并用计算表达式替换它时,但也许我应该坚持直接评估,它适合在我脑海中 ;)。

但我觉得我很接近......有什么想法吗?

0 投票
1 回答
95 浏览

f# - F# 递归类型:方法与函数类型推断差异

有人可以解释一下为什么在 F# 中类型推断似乎在类方法和函数之间的工作方式不同(或我不理解的其他方面?)。

想象一下(简化):

请注意,静态方法Add和函数add具有相同的实现,并且都以递归方式调用自身。

然而前者编译得很好,但后者报告错误:

0 投票
2 回答
96 浏览

types - 不可能用递归类型约束来制作对象?

这是一个纯粹的学术问题,但对这个 关于类型约束的问题提出了质疑。提问者举了一个例子:

f# 愉快地编译。现在的问题是如何制作这个对象?

0 投票
1 回答
475 浏览

struct - 如何在 Racket 中定义递归结构?

我试图在无类型 Racket 中模仿 OCaml 中的递归类型,但我似乎找不到关于定义递归结构的文档。我将如何进行映射:

进入球拍中的东西?

我尝试了以下方法:

但是,当我将 example/c 放入合同时,它并没有按预期工作,因为它声称这是一个程序。有什么帮助吗?

0 投票
0 回答
93 浏览

arrays - 算法(或 C++):查找 2 个数组的索引子集以通过跳转到达它们的末尾

给定两个数组(a,b 只包含 2 个十进制值),我们可以移动。

i+值或i值。其中 value 是该数组中该索引处的元素。

我们只需要遍历每个元素一次即可到达最后一个元素,然后从第一个元素开始。

现在我们如何找出要在 a 和 b 之间交换的值的子集,以便我们可以到达最后一个索引。

例如 a = 112 b = 212 在这里两者都可以到达终点,所以空集也可以。没有任何其他套装可以做到。所以 ans 将是 : {} only。

例如2:a= 2211 b= 1111。这里两个字符串都可以迭代并到达最后一个元素。现在,如果我在 a 和 b 中替换 (1,2) 索引,即现在 a=1111 和 b= 2211 两个字符串仍然可以到达 end 。同样,我们也可以替换 {3},{4},{3,4} 并且我们仍然可以转到两个字符串中的最后一个索引。

现在有算法可以做到这一点吗?我们如何找出这些子集?也许是 dp 解决方案?如果可能的话,如果有人可以指导我完成代码,我将不胜感激。

0 投票
1 回答
212 浏览

f# - 如何在 F# 中实现“高效的广义折叠”?

Martin 等人的论文中。我读到了关于嵌套数据类型的有效广义折叠。这篇论文谈到了 Haskell,我想在 F# 中尝试一下。

到目前为止,我设法遵循了这个Nest例子,包括gfold.

不幸的是,gfold它似乎具有二次复杂性,这就是作者提出efold. 正如您可能猜到的那样,那是我无法工作的那个。在摆弄了许多类型注释之后,我想出了这个版本,它只剩下一个小波浪线:

唯一剩下的未指定类型是h. 编译器推断val h : ('a -> 'a),但我认为需要有不同的类型。

提供的错误消息显示

错误类型不匹配。期望一个
Nest<'a>
但给定一个
Nest<Pair<'a>>
当统一 ''a' 和 'Pair<'a>' 时,结果类型将是无限的

使用正确类型h的错误应该会消失。但我对 Haskell 的理解不够,无法将其翻译成 F#。

另请参阅有关论文中可能出现的错字的讨论。


更新:这是我从kvb的回答中了解到的:

因此h,将输入类型转换为中间类型,就像在累加器可能是不同类型的常规折叠中一样。g然后用于将两个中间类型值减少为一个,同时f获取一个中间类型和一个输入类型以生成输出类型值。当然e也属于那种输出类型。

h确实直接应用于递归期间遇到的值。g另一方面,仅用于使 h 适用于越来越深的类型。

只看第一个例子,除了应用和推动递归f之外,它本身似乎并没有做太多的工作。h但是在复杂的方法中,我可以看到它是最重要的方法。什么出来,即它的工作马。

这对吗?

0 投票
1 回答
245 浏览

data-structures - 在实现手指树时“添加删除检查规则时溢出”

我正在尝试定义一个手指树结构并将其基本操作实现为 Rust 中的一个练习。我想出了以下内容,这基本上就是本文中描述的内容。

编译给了我一个我不明白的错误:

为什么这不起作用?我如何使它工作?

0 投票
2 回答
570 浏览

scala - Scala递归类型和类型构造函数实现

我有一种情况,我需要一种可以接受类型的方法:

让我们将这种类型的 RAI 称为“递归整数数组”

其中 ArrayPrinter 是一个用 RAI 初始化并遍历整个 rai 的类(假设它打印此 Array[Array[Int]] 中的所有值)

它还可以返回原始的 Array[Array[Int]] 而不会丢失任何类型信息。

你如何在 Scala 中实现这一点?

0 投票
3 回答
1320 浏览

kotlin - 是否可以在 Kotlin 中创建递归函数类型?

我有代表流程中步骤的函数。每个函数也知道下一步,如果有的话。我希望能够做类似的事情:

这些函数是从一个中央调度函数调用的,它包含的代码有点像这样:

请注意,特定步骤中的逻辑也决定了下一步(如果有的话)。

我以为我可以定义Step为:

所以 aStep是一个返回另一个Step或 null 的函数。但是,这无法编译:

我可以通过将函数包装在一个对象中来解决这个问题。例如:

并相应地更改我的函数签名。

不幸的是,这意味着我不能只使用函数文字(例如:)::barStep,而是必须将它们包装在 a 中StepWrapper

(我还必须相应地更改我的调度循环。)

如果可能的话,我想避免创建这些包装对象。在 Kotlin 中有没有办法做到这一点?

0 投票
2 回答
323 浏览

haskell - 如何定义仍然具有递归类型的非递归函数的函数类型

给定的是一个Javascript函数,如

这样的功能可能是无稽之谈,但这不是问题所在。

当我试图表达类似 Haskell 的类型注释时,我失败了。同样尝试在 Haskell 中实现类似的功能:

这种函数本身不是递归的,但在它们的类型上是递归的,是否有一个术语?这些函数只能用动态类型语言表达吗?

对不起,如果这很明显 - 我的 Haskell 知识(包括严格的类型系统)相当肤浅。