问题标签 [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.
f# - 试图让绑定为状态和延迟单子的组合工作
如果这个问题的答案是“你做错了”,一定要让我知道一个更合适的方法。我的代码结构如下:
现在这种类型主要是直接使用的,有很多内联代码进行手动绑定,这是我试图摆脱的很多样板,所以我想我把它变成一个计算表达式。正确获取map、bind和apply并不难。
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 )中也注意到了这一点:
也许我遵循了我不应该遵循的模式,但当时这似乎是个好主意,尤其是在尝试重构大量样板代码并用计算表达式替换它时,但也许我应该坚持直接评估,它适合在我脑海中 ;)。
但我觉得我很接近......有什么想法吗?
f# - F# 递归类型:方法与函数类型推断差异
有人可以解释一下为什么在 F# 中类型推断似乎在类方法和函数之间的工作方式不同(或我不理解的其他方面?)。
想象一下(简化):
请注意,静态方法Add
和函数add
具有相同的实现,并且都以递归方式调用自身。
然而前者编译得很好,但后者报告错误:
types - 不可能用递归类型约束来制作对象?
这是一个纯粹的学术问题,但对这个 关于类型约束的问题提出了质疑。提问者举了一个例子:
f# 愉快地编译。现在的问题是如何制作这个对象?
struct - 如何在 Racket 中定义递归结构?
我试图在无类型 Racket 中模仿 OCaml 中的递归类型,但我似乎找不到关于定义递归结构的文档。我将如何进行映射:
进入球拍中的东西?
我尝试了以下方法:
但是,当我将 example/c 放入合同时,它并没有按预期工作,因为它声称这是一个程序。有什么帮助吗?
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 解决方案?如果可能的话,如果有人可以指导我完成代码,我将不胜感激。
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
但是在复杂的方法中,我可以看到它是最重要的方法。什么出来,即它的工作马。
这对吗?
scala - Scala递归类型和类型构造函数实现
我有一种情况,我需要一种可以接受类型的方法:
让我们将这种类型的 RAI 称为“递归整数数组”
其中 ArrayPrinter 是一个用 RAI 初始化并遍历整个 rai 的类(假设它打印此 Array[Array[Int]] 中的所有值)
它还可以返回原始的 Array[Array[Int]] 而不会丢失任何类型信息。
你如何在 Scala 中实现这一点?
kotlin - 是否可以在 Kotlin 中创建递归函数类型?
我有代表流程中步骤的函数。每个函数也知道下一步,如果有的话。我希望能够做类似的事情:
这些函数是从一个中央调度函数调用的,它包含的代码有点像这样:
请注意,特定步骤中的逻辑也决定了下一步(如果有的话)。
我以为我可以定义Step
为:
所以 aStep
是一个返回另一个Step
或 null 的函数。但是,这无法编译:
我可以通过将函数包装在一个对象中来解决这个问题。例如:
并相应地更改我的函数签名。
不幸的是,这意味着我不能只使用函数文字(例如:)::barStep
,而是必须将它们包装在 a 中StepWrapper
:
(我还必须相应地更改我的调度循环。)
如果可能的话,我想避免创建这些包装对象。在 Kotlin 中有没有办法做到这一点?
haskell - 如何定义仍然具有递归类型的非递归函数的函数类型
给定的是一个Javascript函数,如
这样的功能可能是无稽之谈,但这不是问题所在。
当我试图表达类似 Haskell 的类型注释时,我失败了。同样尝试在 Haskell 中实现类似的功能:
这种函数本身不是递归的,但在它们的类型上是递归的,是否有一个术语?这些函数只能用动态类型语言表达吗?
对不起,如果这很明显 - 我的 Haskell 知识(包括严格的类型系统)相当肤浅。