问题标签 [mutual-recursion]
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# - 如何让两个方法互相调用?
对于如何让两种方法互相调用(即有A()callB()和B()call A()),我有点困惑。似乎 F# 仅在代码中遇到该方法后才“看到”该方法,因此如果没有,它只会说value 或 constructor has not been defined。
我在这里错过了一些非常基本的东西吗?
f# - 如何解决 F# 类型引用错误?
我已经翻阅了我的书,并且在谷歌上搜索,直到我用完搜索词,但我仍然找不到这个问题的示例或答案:
以下代码无法编译,因为在声明 Entity 时尚未声明类型 Effect 和类型 Affect。所以我不明白如何解决这个问题。
在 C++ 中,这个问题是通过在 h 文件中声明原型然后包含 h 文件来解决的。在 C# 中,这从来都不是问题。那么它在 F# 中是如何解决的呢?
这里的基本目标是实体类型的对象应该能够列出它可以应用于实体类型的对象的影响。实体还可以列出已应用到它的效果。这样,通过将所有效果与原始实体状态折叠起来,就可以找到实体的“当前”状态。
感谢您的时间,
——亚当·伦达
syntax - F# 前向类型声明
我在 F# 中偶然发现了这个问题。假设,我想声明两个相互引用的类型:
我该怎么做,所以编译器不会产生错误?
python - 这种相互“递归”叫什么?
我的问题是某种非常类似于递归的代码风格,但并不完全如此。引用Wikipedia的话,递归是“一种定义函数的方法,其中被定义的函数应用在它自己的定义中”。类似地,相互递归应用了另一个函数,该函数直接或间接地应用了我们定义的函数。
问题是我正在考虑和处理的代码不使用相同的功能!它在另一个函数中使用相同的代码(作为方法或闭包)。
这里的问题是,虽然我的代码相同,但功能却不同。看一下以下基本的相互递归示例:
这有点直观,并且非常清楚地相互递归。但是,如果我将每个函数包装为每次调用都创建一次的内部函数,则变得不太清楚:
忽略隐式记忆等优化,这会产生一系列函数调用,这些函数调用不是严格递归的,创建和调用各种新函数而不会调用同一个函数两次。尽管如此,所有这些函数都遵循一个通用模板,并且只是一遍又一遍地创建的同一个函数(可能具有不同的自由变量。
再一次,我们可以提出一个直接等价的(毕竟,类实际上只是闭包,对;)使用类的实现。这一点尤其重要,因为这种风格的[insert name here]用于例如Composite Pattern。不同之处在于,对于复合设计模式和大多数用途(甚至是闭包),实例通常不是动态创建的。本质上还是一样的。
这次链是对象创建和方法调用,但原理是一样的。(我实际上会注意到它略有不同,因为 Python 在每个对象的基础上定义了一个简单的包装器,它本身每次都调用相同的函数——但这不一定是我们需要知道的,它也不需要对于类和对象的其他实现需要是正确的。但是,是的,严格来说它是相互递归的,以及......更多的东西,这是我想知道的另一件事。)
optimization - 在 F#/Scala 中优化相互递归的标准方法是什么?
这些语言“本机”不支持相互递归函数优化,所以我想它一定是蹦床或..呵呵..重写为循环)我错过了什么吗?
更新:似乎我确实对 FSharp 撒了谎,但我只是在谷歌搜索时没有看到相互尾随的例子
f# - 由于循环引用,确定如何订购 F# 类型的问题
我有一些扩展通用类型的类型,这些是我的模型。
然后,我为 CRUD 操作的每种模型类型提供了 DAO 类型。
我现在需要一个函数,它可以让我找到给定任何模型类型的 id,所以我为一些杂项函数创建了一个新类型。
问题是我不知道如何订购这些类型。目前我在 dao 之前有模型,但我不知何故需要DAOMiscbeforeCityDAO和CityDAObefore DAOMisc,这是不可能的。
简单的方法是将这个函数放在每个 DAO 中,仅引用可以出现在它之前的类型,因此,在它State之前出现City与State具有外键关系City,所以杂项函数会很短。但是,这让我觉得是错误的,所以我不确定如何最好地解决这个问题。
这是我的杂项类型,其中BaseType是我所有模型的通用类型。
这是一种道类型。CommonDAO实际上有 CRUD 操作的代码,但这在这里并不重要。
这是我的模型类型:
这个FindIdByType函数的目的是我想找到外键关系的 id,所以我可以在我的模型中设置值,然后让 CRUD 函数使用所有正确的信息进行操作。因此,City需要州名的 id,所以我会获取州名,将其放入state类型中,然后调用此函数以获取该州的 id,因此我的城市插入还将包括外键的 id。
这似乎是最好的方法,以一种非常通用的方式处理插入,这是我正在尝试解决的当前问题。
更新:
在定义了所有其他 DAO 之后,我需要研究并查看是否可以以某种方式将 FindIdByType 方法注入 CommonDAO,就好像它是一个闭包一样。如果这是 Java,我会使用 AOP 来获得我正在寻找的功能,但不确定如何在 F# 中执行此操作。
最终更新:
在考虑了我的方法后,我意识到它有致命的缺陷,所以我想出了一个不同的方法。
这就是我将如何进行插入,我决定将这个想法放入每个实体类中,这可能是一个更好的想法。
我还没有开始使用fklist,但它是int list,而且我知道每个列的名称,所以我只需要inner join为选择做,例如。
这是泛化的基本类型插入:
如果 F# 可以做协方差,那就太好了,所以我必须解决这个限制。
f# - 受歧视的工会可以相互引用吗?
我正在使用可区分的联合构建表达式树。下面的代码:
抛出错误,因为 BoolExpression 未定义。正如您所期望的那样,交换定义只会导致相反的结果(未定义 IntExpression)。
有没有解决的办法?
c++ - 相互递归的类
如何在 C++ 中实现相互递归的类?就像是:
haskell - Haskell中的相互递归评估器
更新:我添加了一个描述我最终解决方案的答案(提示:单一Expr数据类型是不够的)。
我正在为一种小表达式语言编写一个评估器,但我被困在这个LetRec结构上。
这是语言:
到目前为止,这是评估员:
这是我要评估的测试功能:
编辑:
根据 Travis 的回答和 Luke 的评论,我更新了我的代码以将 MonadFix 实例用于 Error monad。前面的示例现在可以正常工作了!但是,下面的示例无法正常工作:
评估时,评估器循环,没有任何反应。我猜我在这里做了一些过于严格的事情,但我不确定它是什么。我是否违反了 MonadFix 法律之一?
f# - F#:相互递归函数
可能重复:
[F#] 如何让两个方法互相调用?
大家好,
我有一个场景,我有两个函数可以从相互递归中受益,但我不确定如何在 F# 中执行此操作
我的场景并不像下面的代码那么简单,但我想得到类似编译的东西: