如何对 C# 和 F# 尽可能友好地公开类型?

2023-11-26

例如,如果我用 F# 编写了一个模块

module Lib

type A =
    member this.x1 x = ...

let helpa x = ...
let helpb x = ...

type B =
    member this.y1 x = ...

let helpc x = ...

typeA with
    member this.x2 x = ...
typeB with
    member this.y2 x = ...

它在 F# 中运行良好open Lib,但是,如果我想在 C# 中使用它(我只对类型和成员函数感兴趣)Lib),每次我创建一个类型时,我都必须new Lib.A(...)。无法省略模块名称变得相当烦人。调用静态方法,例如Lib.A.C()更是麻烦。

然后我尝试更换module with namespace,每次引入一些​​辅助函数时,我都必须使用新名称创建一个新模块。有时,我可以设法将所有辅助函数重新排列到 1 个模块中,但这会导致代码可读性较差。

对此,更好的结构是什么?

希望我有:Using * = Lib.* for C#.


F# 在这里比 C# 提供了更多的灵活性,因此我将以标准方式将其公开给 C#,即将类型包含在命名空间中。我认为这样的东西提供了两全其美的优点:

namespace Lib

type A =
    member this.x1 x = ()

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module A =
  let helpa x = ()
  let helpb x = ()

type B =
    member this.y1 x = ()

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module B =
  let helpb x = ()

type A with
    member this.x2 x = ()
type B with
    member this.y2 x = ()

F# 集合遵循类似的设计。您可以使用[<AutoOpen>] and [<RequireQualifiedAccess>]属性以进一步控制如何从 F# 使用模块。

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

如何对 C# 和 F# 尽可能友好地公开类型? 的相关文章

随机推荐

  • 在 ScrollView 中使用 onTouchListener 检测滑动

    我使用以下代码来检测活动中的滑动 getWindow getDecorView getRootView setOnTouchListener new OnTouchListener Override public boolean onTou
  • 使用 Python etree 更新 XML 元素和属性值

    我正在尝试使用Python 2 7ElementTree库来解析 XML 文件 然后用测试数据替换特定元素属性 然后将其保存为唯一的 XML 文件 我的解决方案的想法是 1 通过将文件读取为字符串来从 CSV 文件中获取新数据 2 在某些分
  • 使用相同代码但不同类型的重构方法

    我有几种方法可以做同样的事情 当与 MySQL 数据库连接时 保存或加载不同类型的参数 目前 我对每种类型都有不同的方法 如何组合这些方法以便它们支持不同的类型 下面是两个非常相似但使用不同类型的方法的示例 public static vo
  • 使用 Javascript 与 SQL 服务器握手

    我想尝试 作为学习练习 让我的 javascript 与 sql 聊天 var ws new WebSocket ws 127 0 0 1 1433 似乎没有被阻止的端口 所以理论上它应该可以工作 我正在寻找如何与 sql 服务器握手并与其
  • 显示带有嵌套 ListView 的 IGrouping<>

    我需要从数据访问层检索一组 Widget 按 widget Manufacturer 分组 以显示在一组嵌套的 ASP NET ListView 中 问题是 据我所知 嵌套 ListView 方法要求我在使用数据之前对数据进行整形 而且我无
  • 如何插入、更新和删除日历和事件

    有没有办法添加 删除和更新日历 和 有没有办法在日历中添加 删除和更新事件 Thanks 检查这个代码http code google com p android calendar provider tests source browse
  • AWS 安全组 - EC2 到 RDS

    我想问一下如何将 EC2 连接到 AWS 中的 RDP 我已将 EC2 安全组 包含 EC2 实例 添加到默认 RDP 组中 并且数据正在流动 连接正常 EC2 安全组已启用端口 80 至 0 0 0 0 0 并通过 SSH 连接到我的 I
  • 错误:不变违规:dangerouslyRenderMarkup(...):无法在工作线程中渲染标记

    设置状态导致第二次渲染后反应测试失败 到目前为止 JSDOM 和 Mocha 的测试进展顺利 到目前为止 还没有必要测试任何改变其状态的组件 我发现我的第一个问题是测试一个改变其状态的组件 错误 1 Reduced Test Case cu
  • JavaFX 在全屏模式下更改场景

    我在使用 JavaFX 时遇到问题 我创建了两个场景和切换按钮 当我单击该按钮时 我正在改变场景 但早些时候我将全屏设置为 true 按下按钮后 Windows 任务栏会显示一会儿 有没有办法在不显示此任务栏的情况下更改场景 有代码 主班
  • 是否有所有国际句号标点符号的字符集?

    我正在尝试将 utf 8 字符串解析为 一口大小 的段 例如 我想将文本分解为 句子 是否存在与所有语言的句子结尾相对应的字符 或正则表达式 的全面集合 我正在寻找能够捕捉拉丁语句号 感叹号和问号 中文和日文句号等的东西 类似上面的东西 但
  • 未捕获的 InvalidValueError:不是功能或功能集合

    看到最近的一个video由 Google 开发人员制作 我决定制作一张英国的区域地图 这个网站上提到了几种可能性 但我后来不得不放弃 所以我最终使用了这个网站 数据下载的示例页面 http mapit mysociety org area
  • RxJs Observables:在更多异步请求后运行 retryWhen

    我的用例是 用户从我们的 API 请求资产 由于 JWT 过期而失败 作为 httpOnly cookie 传递 API 返回 401 状态代码 我们再次使用refresh token对它们进行身份验证 无需用户执行任何操作 以通过客户端向
  • 查询查找外键

    我有一个数据库 需要删除一些外键 但我事先不知道外键是否仍然存在 我发现了一些存储过程 http forums mysql com read php 97 218825 247526 这可以解决问题 但我不想为此创建存储过程 我尝试在存储过
  • 使用 Wss4jSecurityInterceptor 会引发 WRONG_DOCUMENT_ERR:节点在与创建它的文档不同的文档中使用

    我正在将应用程序升级到 Java 11 和 Spring boot 2 1 2 并在尝试通过 SOAP 与外部合作伙伴进行通信时遇到以下错误 导致此问题的是 Wss4jSecurityInterceptor 在运行 java 8 和 Spr
  • 为什么使用 ConfigurationManager.GetSection 会导致“SecurityException:请求失败”,但 ConfigurationManager.OpenExeConfiguration 不会?

    我有一些好奇的事情希望 Net 专家可以帮助我 我有一个自定义配置部分 为了掌握它 我这样做 var s TestConfigurationSection ConfigurationManager GetSection testSectio
  • CSS Hacks、Firefox 3.5 和 Google Chrome

    我四处搜寻 据说 body nth of type 1 在 CSS 中使用仅针对 Safari 和 Google Chrome 你瞧 Mozilla 也正确地解读了它 我又搜索了十遍 但一无所获 所以我就在这里 有没有仅适用于 Google
  • 安装 Raqm (Libraqm) Windows 10

    我正在尝试改变方向 of text on an image using pil on python3 但我无法这样做 因为依赖性未安装 libraqm 我找不到安装方法libraqm 我尝试通过pip安装 但是没有成功 我也尝试找到它 我找
  • 寻找最大元素的时间复杂度分析

    我遇到了一个家庭作业问题 其中哪一个是最佳算法最佳情况运行时间的渐近紧上限 该算法在任意大小的整数数组中查找最大元素n O log n O n2 O n O 1 O n log n 根据我的理解 它是 O n 因为即使这是最好的情况我们仍然
  • Windows 10 Gradle:JAVA_HOME 设置为无效目录

    我试图奔跑 gradlew bootRun同时Git Bash and 电源外壳 并得到这个错误 ERROR JAVA HOME is set to an invalid directory C Program Files Java jre
  • 如何对 C# 和 F# 尽可能友好地公开类型?

    例如 如果我用 F 编写了一个模块 module Lib type A member this x1 x let helpa x let helpb x type B member this y1 x let helpc x typeA w