设计可在 F# 中很好使用的 C# 库的指南

2023-12-29

我只是想指出这个问题并不是相反的

设计供 F# 和 C# 使用的 F# 库的最佳方法 https://stackoverflow.com/questions/10110174/best-approach-for-designing-f-libraries-for-use-from-both-f-and-c-sharp

在这里,我不是问如何设计一个用 C# 编写的函数库,以便在这两个世界中使用。

我想知道良好做法什么设计选择拥抱或避免获得合理的妥协来制作这个库可从 F# 使用.

实践例如(例如):

  • 使对象层次结构尽可能简单

  • 避免改变对象的状态,但返回新的对象

  • etc...

有做过的朋友可以分享一下经验吗?

边注

有趣的是这个 OSS 项目,IronJS https://github.com/fholm/IronJS。是的,它是用 F# 编写的,但是作者公开了两个专门的主机IronJS.Hosting.FSharp and IronJS.Hosting.CSharp.


想象一下,有一天您想用 F# 重写 C# 库以获得更好的可用性。以下是您可能采取的路径:

我重点关注路径“命令式 C# --> 函数式 C# --> 函数式 F# --> 惯用 F#”。您的 C# 库的功能越多,您的库在 F# 中的可用性就越高。函数式风格有助于提高可组合性,并且更接近惯用的 F# 代码。沿着这些思路,您可以:

  • Embrace 默认不变性原则。如果您不知道稍后是否需要更新某个字段/属性,只需标记它readonly first.
  • 遵循基于表达式和声明性的编程风格。 LINQ 操作就是很好的例子。
  • 使用不可变集合或以不可变方式使用可变集合。随着C# 不可变集合简介 http://blogs.msdn.com/b/bclteam/archive/2012/12/18/preview-of-immutable-collections-released-on-nuget.aspx,它应该比以前更容易。

上图取自F# 的乐趣和利润 http://fsharpforfunandprofit.com/'s 从 C# 移植到 F# 系列 http://fsharpforfunandprofit.com/posts/porting-to-csharp-intro/。他们非常乐于助人;了解 C# 概念如何在 F# 中表达将提高库的可用性。

C# 的面向对象特性是很难避免的。请记住,F# 类型推断不能很好地使用这些功能。为了保持对象层次结构简单,您应该减少成员重载的数量。大量成员重载很容易使 F# 类型检查器感到困惑。而且,这并没有什么坏处使用 C# 库分发瘦 F# 包装器。您需要做的某些事情是将某些方法转换为模块函数并创建活跃模式 http://msdn.microsoft.com/en-us/library/dd233248.aspx分解对象层次结构。

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

设计可在 F# 中很好使用的 C# 库的指南 的相关文章

随机推荐

  • Objective-C - 'sendSynchronousRequest:returningResponse:error:' 已弃用:首先在 iOS 9.0 中弃用

    NSArray deviceCheck NSString device NSString deviceRequestString NSString stringWithFormat device webservice device NSUR
  • JQuery - 表单重置 - 排除“选择”框

    All 我可以使用以下 JQuery 语法重置所有表单元素 myform 0 reset 如何修改它以排除 选择框 值的重置 Thanks 给大家 重置函数不会将所有内容设置为 空字符串 它重置为初始值 存储在值属性中 或选定的选项等 如果
  • ASP.NET 错误:此页面的状态信息无效并且可能已损坏

    我没有 JQuery 或其他 javascript 更改值或 html 结构 而且我没有动态添加的控件 我仍然收到错误 该页面的状态信息无效并且可能已损坏 该错误的发生有些随机 这是我如何复制问题的 aspx file
  • 从 PHP 中的 RNCryptor AES 256 标头检索 IV

    使用最新的 RNCryptor 源并尝试将加密数据发送到 PHP 脚本 RNCryptor 将 IV 打包到标头部分中 该标头部分被添加到实际加密数据的前面 NSData header uint8 t header 2 kRNCryptor
  • Rails 使用 MS SQL Server 数据库

    在我的 Rails 应用程序中 我需要使用现有的 MS SQL 数据库 我尝试按照本手册操作 http rubyrailsandwindows blogspot com 2008 03 rails 2 and sql server 2008
  • 当类位于服务项目中时,Moq 在不可重写的成员上抛出无效设置

    我正在尝试对此类 ServizioController 进行单元测试 public class ServizioController IServizioController public virtual void PerformAction
  • 如何捕捉Android软键盘上的“下一步”按钮

    我有 6 个 Edittexts 分为 6 种不同的布局 全部位于同一视图中 我的问题是我的应用程序被迫进入横向模式 并且通过按 下一步 按钮 我想自动开始编辑另一个 editText 而不是默认情况下 android 设置的那个 示例 我
  • 需要帮助使用表达式 SSRS 使用两个数据集进行计算

    我正在创建 SSRS 报告 其中 在 Dataset15 中 我的值为 Jan 100 和 Feb 110 在 Dataset16 中 我的值为 Jan 80 和 Feb 100 现在我想使用表达式在折线图中计算相同的内容 Jan 80 1
  • 我可以在 php 中使用 javascript 正则表达式吗

    我在 javascript 中使用正则表达式 并希望使用相同的正则表达式进行服务器端验证 我是否需要修改它以使其兼容 或者它会按原样运行吗 如何使用 PHP 正则表达式 请提供一个小例子 提前致谢 EDIT 用于电子邮件验证 var pat
  • 在 python 中更改全局变量值时出现问题

    假设我有这个功能 gt gt gt a 3 gt gt gt def num a a 5 return a gt gt gt num a 5 gt gt gt a 3 a 的值不会改变 现在考虑这段代码 gt gt gt index 1 g
  • 如何删除codeigniter代码中的index.php?

    我想从 codeigniter 的 url 中删除 index php 所以在用户指南中 有办法通过编辑 htaccess 来做到这一点 但我的主机不允许编辑它 有什么办法可以处理 codeigniter 的代码吗 谢谢 抱歉 恐怕这是不可
  • Java 8 添加对象列表的多个属性的值

    假设我下面有一个带有 getter 和 setter 的类 但只有默认构造函数 注意 我不允许更改此类的结构 class Target private String year private String month private Str
  • 是否有“好的”PRNG 生成没有隐藏状态的值?

    我需要一些好的伪随机数生成器 它可以像纯函数一样根据之前的输出进行计算 而无需任何状态隐藏 好 我的意思是 我必须能够以运行它的方式参数化生成器2 n任何参数 或其中一些大的子集 的迭代应覆盖之间的所有或几乎所有值0 and 2 n 1 w
  • Oozie Hive 动作挂起,心跳永远

    我试图通过我在 Hue 中创建的 Oozie 工作流程运行 Hive 操作 但该操作永远 心跳 并且不会执行 Hive SQL 我读过其他关于心跳永远的文章 但这篇文章似乎发生在不同的时刻 即在解析 SQL 语句之后 我检查了集群中每个节点
  • JavaScript 异常堆栈跟踪

    在 Firefox 中 我可以通过使用获取异常的堆栈跟踪exception stack 有没有办法在其他浏览器中也获得它 Edit 我实际上想自动保存堆栈跟踪 如果可能 而不是在当时对其进行调试 即我知道如何在调试器中获取堆栈跟踪 将此行放
  • 如何实现利用多个 ViewController 的 UIPageViewController

    我一直在开发一个简单的测试应用程序来了解 UIPageViewController 的细节 我已经让它工作了 但我不相信我的执行是最好的方法 我希望你们中的一些人能给我指出正确的方向 为了获得基本的了解 我使用本教程作为起点 http ww
  • 升级 local::lib 安装的所有模块

    我一直在使用 local lib 来处理服务器上 Perl 模块的安装 这样我就可以获得一些开发工作的正确版本 而不会污染系统安装 然而 系统管理员最近将 Perl 从 5 16 升级到 5 18 我现在收到与二进制模块相关的错误 例如 p
  • OpenShift Next Gen 无法挂载持久卷

    我正在尝试在 OpenShift Online Next Gen 上设置一个应用程序 我需要在运行时存储一个小文件并在启动期间再次读取它 文件的内容发生了变化 因此我不能简单地将其添加到我的源代码中 我的项目已经启动并运行 我所需要的只是持
  • 如何在 python3 和“requests”上发布图像和文本 MultipartForm?

    我正在将代码从 NodeJS 移植到 python3 我想发布图像二进制数据和文本 我该怎么做 谢谢 NodeJS filePath xxx jpeg text xxx return chakram request POST http xx
  • 设计可在 F# 中很好使用的 C# 库的指南

    我只是想指出这个问题并不是相反的 设计供 F 和 C 使用的 F 库的最佳方法 https stackoverflow com questions 10110174 best approach for designing f librari