我只是想指出这个问题并不是相反的
设计供 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(使用前将#替换为@)