在同一解决方案中混合使用F#和C#的模式

时间:2009-11-30 00:12:23

标签: c# .net design-patterns f#

我研究了很少的函数式语言,主要用于学术目的。然而,当我必须投影客户端 - 服务器应用程序时,我总是开始采用域驱动设计,严格来说是OOP。

使用.Net框架编写的复杂解决方案可以使用多种语言获得优势,有时甚至超过范例。将C或C ++与LUA或Python混合是一种常见的做法,有时嵌入prolog可能非常有趣。 我从未试图将OOP和功能范例混合在一起。

F#是一种更新的功能和面向对象语言,我看到在同一解决方案中将C#与F#库混合在技术上非常容易。但我想知道它是否有意义:我使用LINQ来满足我的许多功能要求。

何时以及如何,您认为将这两种语言混合在一起是一个好主意吗? 我想知道是否存在一组试图这样做的模式。

你真的在C#解决方案中使用F#吗?

8 个答案:

答案 0 :(得分:16)

在某些地方,传统的功能技术很有意义,并且导致代码更小,更简洁。一个典型的例子是文本解析和树处理,当你实现DSL时,它们经常出现在一起。 F#特性如匿名迭代器,可扩展模式匹配以及定义自定义中缀运算符以充当组合器的能力在这里确实有很大帮助。同时,在C#方面,LINQ是一个良好的开端,但它不会一直带你到那里。

我建议你看一下FParsec,并亲自看看它比高级文本处理/解析更适合你用C#写的任何库。

答案 1 :(得分:14)

我在F#中编写了一个WCF服务,它充当翻译插件,用于读取WFS(地理空间数据)服务。代码变得简洁明了。

虽然我编译的独立dll在我的同事的C#解决方案中运行良好,但当我向他展示代码时,他确实试图扼杀我。我认为文化冲击。

我们在同一个项目中使用F#和C#吗?是的,不是。不,因为我用C#重写了这个东西。是的,因为在F#中构建和测试原型比我花费更多时间将它翻译成C#LINQ风格。

我不想尝试在F#中构建所有东西,但是我耐心地等待着我可以在F#中使用混合语言解决方案的数据处理/算法部分工作的那一天而不用担心我的生命。

答案 2 :(得分:5)

你让我思考,我试着决定在哪里做。有两种情况需要考虑:

  1. 如果我正在制作城堡(MVC)项目,我可能会在C#中使用控制器,而所有BL和模型都在F#中(我倾向于进行域驱动设计并将BL连接到模型中,或者通过注入的组件[ ala DI])
  2. 启动一个新项目,但合并现有的库,以便不重新发明轮子。
  3. 此外,我是“正确的工作工具”的大力倡导者,所以如果我认为其中一个或哪个更适合,我会使用它。

答案 3 :(得分:5)

我们有一个应用程序通过加载MEF部分来获取其所有功能。 大多数部分都是用C#编写的,但有一部分是用F#编写的二进制数据处理。在这种情况下,F#更适合这项工作。

F#部分符合C#中定义的接口,C#应用程序不知道 它正在处理一个F#部分(除了对fsharp.dll的依赖)。

当然,这不仅仅适用于F#,如果有人想用另一种语言写一个或重写一个部分(插件,模块,无论你想叫什么),它将被MEF选中并提供给我们申请没有任何不利之处。

我们选择最适合解决特定问题的语言,MEF将所有细节抽象出来,因此我们无需担心。

答案 4 :(得分:3)

我在C#解决方案中使用F#进行探索性编程。例如。我通过可视化工作室F#交互式控制台启动我的C#WPF应用程序,并在正在运行的应用程序中查找。可以为您节省大量的编辑 - 编译 - 调试会话..

答案 5 :(得分:2)

语言只是一种工具。像Luke一样,我非常喜欢使用合适的工具来完成工作。如果一个特定的应用程序将从使用C#和F#中受益,那么混合对我来说似乎是合理的。

至于如何做,请参阅:

Can you mix .net languages within a single project?

结论:您可以将使用不同语言的两个DLL合并为一个DLL作为构建后步骤。或者,您可以在服务器端编译的网站中使用多种语言。

答案 6 :(得分:0)

是的,将来我认为我们必须将OOP(C#)等语言与功能语言(F#)结合起来,以利用多核处理。 C#4有类支持这个,但有些事情在F#中做得更好。

答案 7 :(得分:0)

还没有尝试过,但我肯定想使用函数式语言的地方,即使这可能不是使用它的理由,也是为了让我可以避免这里描述的内容

http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html

我想将此命名为动词,并执行它

calculateSomething()而不是SomtingCalculator.Execute()