是否可以定义相互依赖的类型并在单独的文件中定义?

2024-03-14

我正在尝试实现一个具有扩展解析功能的库。我决定使用 fsyacc 因为我从大学就知道它。不幸的是我遇到了以下问题。

我为我的语法头部定义了一个类(Head)并将其实现放在一个文件中。然后我将解析器定义为:

...
%start head
%type <Head> head
...

Fsyacc 生成分离的模块(Parser)。为了成功,必须按以下顺序编译:Head.fs Parser.fs

为了使这个库类似于您在 .NET 中可以找到的库,我想添加一个静态Parse方法Head。不幸的是我需要使用以下方法Parser module.

我知道这样的类型依赖可以用 ' 解决and' 运算符,但它仅适用于一个文件中定义的类型。

是否有其他方法可以创建相互依赖的类型,即使它们位于单独的文件中?我一直在寻找类似于 C/C++ 中的声明/实现分离机制,但我找不到任何东西。


简短的回答:不。 F# 2.0 中无法跨多个文件执行相互递归实体。 (这是我们计划在该语言的下一版本中解决的问题。)

您可以通过多种方式解决此问题,通常使用间接点和突变点。例如,您的 Head 类型可能有一个静态“InitializeParser”方法,该方法将函数值放入可变全局变量中,然后 Head 中定义的静态 Parse 方法可以通过该可变全局调用,并且在实际定义解析器之后,它可以去调用InitializeParser来插入值。(如果这没有意义,我可以更详细地拼写出来。)

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

是否可以定义相互依赖的类型并在单独的文件中定义? 的相关文章

  • 更换 I 过滤器

    我目前正在使用 IFilters 从各种文件 word excel tiff pdf 等 中提取文本 据我所知 IFilter 已在 Windows 8 中停止使用 是否有人对如何在不安装本机应用程序的情况下提取文本有任何建议 如果有什么用
  • 找不到 Microsoft.Office.Interop Visual Studio

    我正在开发一个使用 C 发送电子邮件的应用程序 该应用程序将能够使用邮件模板等 问题是我无法找到任何 Office Interop 引用 这意味着我无法使用 Outlook 我的计算机上安装了 Office 但我也尝试从此链接安装 PIAh
  • 调整图像的亮度、对比度和伽玛值

    在 NET 中调整图像的亮度 对比度和伽玛值的简单方法是什么 c and gdi have a simple way to control the colors that are drawn It s basically a ColorMa
  • CompileAssemblyFromDom 抛出访问被拒绝异常

    代码 using var codeProvider new CSharpCodeProvider var compilerParameter new CompilerParameters assemblies assemblyName fa
  • 枚举扩展方法

    在vs2008中 是否可以编写适用于任何枚举的扩展方法 我知道您可以针对特定枚举编写扩展方法 但我希望能够使用单个扩展方法对每个枚举进行处理 这可能吗 是的 只需针对基础进行编码Enum类型 例如 public static void So
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何根据给定的点生成热图

    我想生成 Windows 形式的热图 我有一组点作为输入 如何以最简单的方式做到这一点 谢谢 基于此处已有的答案 此方法允许您指定Colors您希望用作最大和最小颜色 private Color HeatMapColor double va
  • 抛出并保留堆栈跟踪不符合代码分析所描述的预期

    进行代码分析给了我项目 CA2200 CA2200 重新抛出以保留堆栈详细信息 func 重新抛出捕获的异常并将其显式指定为参数 请改用不带参数的 throw 以保留最初引发异常的堆栈位置 我已经实现了该建议 但无论如何我似乎都得到了相同的
  • 如何拦截 Boo 中的方法调用?

    红宝石有method missing Python有getattr Boo 是否提供了一些可以用来拦截方法调用的东西 是的 布有IQuackFu http docs codehaus org pages viewpage action pa
  • 当操作系统显示语言为非英语时获取本地时区标识符

    奇怪的是 TimeZone CurrentTimeZone StandardName根据计算机显示语言返回本地化名称 我想要一个可以提供给的程序化标识符TimeZoneInfo在下面的代码中 TimeZoneInfo timeZoneInf
  • Winforms 中的 WPF ElementHost 最大化时崩溃 (Windows)

    我正在尝试将新的 WPF 控件集成到现有的 WinForms 应用程序中 并使用 ElementHost Dock Fill 来托管以下 XAML UserControl NET 4 当我将 WinForm 设置为最大化时 我的整个操作系统
  • 为什么 new String("Hello") 在 C# 中无效?

    制作背后的逻辑 原因是什么 String s new String Hello World 在 C 中非法 错误是 string String char 的最佳重载方法匹配有一些无效参数 我对 API 文档不感兴趣 我感兴趣的是为什么这是非
  • 如何计算最低系统要求?

    对于我用 Visual C 编写的应用程序 Testing 不 真的 这就是全部
  • 什么时候值得使用 BindingSource?

    我想我非常了解 BindingSource 类的作用 即在数据源和 UI 控件之间提供一个间接层 它实现了 IBindingList 接口 因此还提供了对排序的支持 而且我已经经常使用它 没有太多问题 但我想知道我使用它的频率是否超过了应有
  • .NET 中是否有内置函数可以对密码进行哈希处理?

    我看到这个问题加密 散列数据库中的纯文本密码 https stackoverflow com questions 287517 encrypting hashing plain text passwords in database 我知道我
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • F#:仅对第一个事件执行一次操作,没有可变性/锁定?

    我有这段代码 可以下载文件并在控制台中告诉我该文件有多大 use webClient new WebClient let lockObj new Object let mutable firstProgressEvent true let

随机推荐