F# 中不同文件的类型和函数之间的循环依赖问题

2023-12-01

我当前的项目使用具有 40 种不同类型(可区分联合)的 AST,并且该 AST 中的几种类型具有循环依赖关系。 类型不是很大,因此我将它们放在一个文件中并应用type ... and ...相互依赖类型的构造。

现在,我添加函数来对 AST 中的每个元素进行一些计算。 由于有很多函数,其中有几行代码,为了使源代码更清晰易读,我将这些函数分离在不同的文件中。

在不存在循环依赖的情况下没问题,当依赖函数位于同一个文件中时也可以工作 - 在这种情况下我可以使用let rec function1 ... and function2 ...建造。

但它不适用于我的情况。

另外,我错误地认为签名文件可以帮助我解决这个问题,但它们的行为与 C++ 不同

  • 它们用于定义函数/类型访问模式(内部/公共),也可以在此处添加函数/类型注释头。

我看到的唯一可能的解决方案是将所有函数移至一个文件并使用let rec ... and ... and ... and ... and ...建造。

可能有人有不同的想法?


正如评论中提到的,无法在多个文件之间分割具有循环依赖关系的函数(或类型)。签名文件主要用于文档目的,因此没有帮助。

如果不知道确切的依赖关系是什么,就很难给出一些建议。但是,可以使用函数或接口重构实现的某些部分。例如,如果您有:

let rec process1 (a:T1) = 
  match a with
  | Leaf -> 0
  | T2Thing(b) -> process2 b

and process2 (b:T2) = 
  match b with 
  | T1Thing(a) -> process1 a

您可以修改该功能process1将第二个函数作为参数。这使得可以在两个文件之间分割实现,因为它们不再相互递归:

// File1.fs
let process1 (a:T1) process2 = 
  match a with
  | Leaf -> 0
  | T2Thing(b) -> process2 b

// File2.fs
let rec process2 (b:T2) = 
  match b with 
  | T1Thing(a) -> process1 a process2

如果你能找到一些更清晰的结构 - 例如两个功能块包含逻辑上相关的功能并且需要互相访问,那么也可以定义一个接口。对于只有两个函数的示例来说这没有多大意义,但它看起来像这样:

type IProcess2 = 
  abstract Process : T2 -> int

let process1 (a:T1) (process2:IProcess2) = 
  match a with
  | Leaf -> 0
  | T2Thing(b) -> process2.Process b

let rec process2 (b:T2) = 
  let process2i = 
    { new IProcess2 with 
        member x.Process(a) = process2 a }
  match b with 
  | T1Thing(a) -> 
    process1 a process2i

无论如何,这些只是一些通用技术。如果不了解您正在使用的类型,则很难给出更准确的建议。如果您可以分享更多详细信息,也许我们可以找到一种方法来避免一些递归引用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# 中不同文件的类型和函数之间的循环依赖问题 的相关文章

  • 继续“F# 中是否存在与 C# 的 nameof(..) 等效的内容?”

    参考F 中是否存在相当于 C 的 nameof 的功能 https stackoverflow com questions 48304398 is there an equivalent of cs nameof in f 在以下情况下如何
  • Scala 相当于 F# 中的 |> 或 Clojure 中的 ->>

    在 Scala 中 当我有这个表达式时 f1 f2 f3 p 有没有一种方法可以让我使用类似的东西 F p gt f3 gt f2 gt f1 还是 Clojure gt gt p f3 f2 f1 Scala 中没有相当于 F 的管道运算
  • 在 F# 列表中键入扩展名

    假设我有一个类型 let MyType some info 但是 它通常用于列表 MyType list 所以我可以定义 let MyTypeList MyType list 有没有办法在 MyTypeList 上定义类型增强 我的实际情况
  • F# 类型函数和 [] 属性

    这两个 F 类型函数有什么区别 let defaultInstance1 lt a when a new unit gt a gt new a
  • 如何从复合泛型类型中检索值?

    如何从泛型中检索值 具体来说 我正在尝试以下操作 Test let result Validate goodInput How to access record let request getRequest result 这是代码 type
  • 没有带有常量“模板参数”的 F# 泛型?

    我突然想到 F 泛型似乎不接受常量值作为 模板参数 假设有人想创建一种类型RangedInt这样 它的行为类似于 int 但保证只包含整数值的子范围 一种可能的方法是建立受歧视的工会 类似于 type RangedInt Valid of
  • 如何在 F# 列表和 F# 元组之间进行转换?

    有没有办法在 F List 和 F Tuple 之间进行转换 例如 1 2 3 gt 1 2 3 1 2 3 4 gt 1 2 3 4 我需要两个函数来做到这一点 let listToTuple list let tupleToList t
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • 绘图 Deedle 框架

    我有以下代码 let mychart frame GetAllSeries gt Seq iter fun key value gt Chart Line value Name key gt Chart Combine where fram
  • 与 F# List.nth 的参数顺序混淆

    List nth is T 列表 gt 整数 gt T 而不是标准int gt T 列表 gt T like Seq nth 这使得管道有些尴尬 难道幕后有什么事情吗 我不知道为什么 可能是为了ocaml兼容性 http www csc v
  • 在 F# 中实现返回 Task 的 C# 方法

    我正在 F 中创建一个类型 该类型继承自 C 类 该类公开返回的方法Task
  • Async.TryCancelled 不适用于 Async.RunSynchronously

    我尝试创建一个根据用户交互更新 UI 的代理 如果用户单击按钮 则应刷新 GUI 模型的准备需要很长时间 因此希望如果用户单击其他按钮 则取消准备并开始新的准备 到目前为止我所拥有的 open System Threading type p
  • F# 2010 Seq.generate_using

    Visual Studio 2010 中的 Seq generate using 是否有替代 解决方法 FSharp PowerPack dll 不适用于 2010 AFAIK 很抱歉 2010 年的 PowerPack 尚未上市 我不记得
  • 何时在 F# 中使用区分联合与记录类型

    在继续讨论复杂的示例之前 我试图先弄清楚 F 的基础知识 我正在学习的材料介绍了区分联合和记录类型 我已经审阅了两者的材料 但我仍然不清楚为什么我们要使用其中之一而不是另一个 我创建的大多数玩具示例似乎都可以在两者中实现 记录似乎非常接近我
  • 按属性值选择 XML 节点

  • 第 100 次避免循环导入

    Summary 我继续有一个ImportError在一个复杂的项目中 我已经将其蒸馏到仍然会出现错误的最低限度 Example 巫师有装有绿色和棕色药水的容器 这些可以添加在一起 产生同样是绿色或棕色的新药水 我们有一个PotionABC
  • 将 Foq 与 F# 函数类型结合使用

    例如 我使用 F 类型定义来防止函数之间的硬依赖 type IType1 int gt int type IType2 int gt string let func1 i int int i i let func2 i int string
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 在 Deedle 系列中算得上独一无二

    我想对我的数据框中的系列有一个概述 例如 pandas 的唯一值计数 我不知道是否有内置函数可以实现这一点 到目前为止 我已经完成了一个函数来获取不同特征的数量 我可以设法完成这项工作 我的问题只是关于内置功能 let unique s D
  • 在 F# 类型提供程序中发出生成的类型

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https

随机推荐

  • 无法施展通用套装?

    我今天遇到一个有趣的问题 考虑下面的代码 public static class Parent public static class Child extends Parent Set
  • 如何用 R 中的特定值替换 NA 值?

    我有一个时间序列数据框 但该数据包含 NA 如下所示 KQ11 Open KQ11 High KQ11 Low KQ11 Close KQ11 Volume KQ11 Adjusted 2017 04 05 627 89 630 17 62
  • 使用 AngularFire 中的记录进行基本用户身份验证

    在花了几天时间尝试不同的 各种推荐的方法来做到这一点之后 我找到了我认为最简单和最有希望的方法 也感谢这个问题的好心人 获取 Firebase AngularFire 中项目的索引 ID 当前设置 用户可以使用电子邮件和社交网络登录 因此当
  • turtle.done() 在 Spyder 中不起作用

    这个简单的 Python 脚本 import turtle bob turtle Turtle bob forward 50 turtle done 使用 Spyder 运行时会出现错误 第一次运行按预期工作 但之后 IPython 控制台
  • BadFilterError:过滤器无效:每个查询只能有一个属性具有不等式过滤器(<=、>=、<、>)

    我正在尝试对两个不同的属性应用过滤器 但 GAE 不允许我这样做 那么解决方案是什么 这是代码片段 if searchParentX que filter parentX gt searchParentX filter parentX lt
  • TWIG - 在不同模板中包含变量

    我想在不同的模板中包含相同的变量 vars catchphrase twig set catchphrase size if var tile catchphrase length lt 4 set catchphrase size siz
  • 各种符号(*、&等)与参数组合有什么区别? [复制]

    这个问题在这里已经有答案了 可能的重复 我知道这对你们许多人来说可能是一个非常基本的问题 但尽管我尽了最大的努力 但我确实很难找到一个好的 彻底的解释 我确信答案就在那里 所以我的搜索词一定很糟糕 在 C 中 使用各种符号及其组合来标记参数
  • 如何使用电影动画正确引用无花果和斧头

    data dict x 0 0 3760 448435678077 0 12 4851 68102541007 0 2226 5297 61518907981 0 2479 4812 134249142693 0 2724 4756 529
  • 可访问性在模拟器上有效,但在设备上无效

    在我的项目中 我使用 Apple 提供的 Reachability 类 当没有互联网连接时 我会显示一条警报消息 当我在模拟器上测试它时 一切工作正常 但是当我在 iPad 上运行它时 在没有互联网的情况下不会显示警报消息 我在 iOS 5
  • 如何将向量写入FileStorage

    我已经能够使用 FileStorage 成功地将关键点 向量 描述符 Mat 和其他内容写入 yml 文件 但是 在计算一对图像之间的匹配后 我无法将匹配写入文件 我假设这是因为 DMatch 似乎是一个具有距离 trainIdx 等字段的
  • 如何从元素中删除所有属性

    如何删除整个文档中特定元素的所有属性 我正在尝试这样的事情 from bs4 import UnicodeDammit from lxml import html content open source html read document
  • iOS:将图像幻灯片的 setImageInputs 设置为图像数组

    我正在使用来自的图像幻灯片here iconArr UIImage named home min UIImage named category min UIImage named settings min UIImage named con
  • 在数据库的 dplyr 过滤函数中传递 SQL 函数

    我在用着dplyr的自动SQL后端从数据库表中查询子表 例如 my tbl lt tbl my db my table where my table在数据库中看起来像 batch name value batch A 1 1 batch A
  • 使用 Powershell 替换方括号

    如果您有一个文件名 例如 委员会会议纪要 2010 年 10 月 hq doc 如何让 Powershell 替换方括号 以下不起作用 ls filter foreach Process Rename Item NewName Name r
  • 如何在slick中使用事务

    我有这样的插入方法 权重是索引 implicit def run A action DBIOAction A NoStream lt slick dbio Effect Future A db run action def insert n
  • 计算 int 中使用的位数

    如果你有二进制数 10110 我怎样才能让它返回 5 例如 一个数字表示使用了多少位 下面列出了一些类似的例子 101 应返回 3 000000011 应返回 2 11100 应该返回 5 101010101 应返回 9 在Java中如何以
  • IIS 是否可以要求 SSL 客户端证书而不将其映射到 Windows 用户?

    我希望能够将 SSL 客户端证书映射到 ASP NET Identity 用户 我希望 IIS 完成尽可能多的工作 协商客户端证书并可能验证它是否由受信任的 CA 签名 但我不希望 IIS 将证书映射到 Windows 用户 客户端证书传递
  • 在 QtWebEngine 中捕获 JavaScript 事件

    我必须使用 JavaScript 捕获从网页分派的事件 然后将其连接到我的 MainWindow 类中的插槽 接近这个的东西 QWebEngineView view view gt load QUrl https test com conn
  • Google 地图 - 围绕现有标记创建多边形

    我不知道这是否可能 但我使用谷歌地图通过覆盖层上的标记来绘制实体的位置 我希望能够在所有创建的标记周围创建一个多边形或某种其他类型的覆盖对象 突出显示标记的范围 类似于集水区图 在从数据库中检索所有标记并映射范围之前我不会知道 任何人有任何
  • F# 中不同文件的类型和函数之间的循环依赖问题

    我当前的项目使用具有 40 种不同类型 可区分联合 的 AST 并且该 AST 中的几种类型具有循环依赖关系 类型不是很大 因此我将它们放在一个文件中并应用type and 相互依赖类型的构造 现在 我添加函数来对 AST 中的每个元素进行