我研究了很少的函数式语言,主要用于学术目的.然而,当我必须投影客户端 - 服务器应用程序时,我总是开始采用域驱动设计,严格来说是OOP.
用.Net框架编写的复杂解决方案可以使用多种语言获得优势,有时甚至超过范例.将C或C++与LUA或Python混合是一种常见的做法,有时嵌入prolog可能非常有趣.我从未试图将OOP和功能范例混合在一起.
F#是一种更新的功能和面向对象的语言,我看到在同一解决方案中将C#与F#库混合在技术上非常容易.但我想知道它是否有意义:我使用LINQ来满足我的许多功能要求.
何时以及如何,您认为将这两种语言混合在一起是一个好主意吗?我想知道是否存在一组试图这样做的模式.
你真的在C#解决方案中使用F#吗?
在某些地方,传统的功能技术很有意义,并且导致代码更小,更简洁.一个典型的例子是文本解析和树处理,当你实现DSL时,它们经常出现在一起.F#特性如匿名迭代器,可扩展模式匹配以及定义自定义中缀运算符以充当组合器的能力在这里确实有很大帮助.同时,在C#方面,LINQ是一个良好的开端,但它并没有带你到处.
我建议你看一下FParsec,自己看看它比高级文本处理/解析更适合你用C#写的任何库.
我在F#中编写了一个WCF服务,它充当翻译插件,用于读取WFS(地理空间数据)服务.代码变得简洁明了.
虽然我编译的独立dll在我的同事的C#解决方案中运行良好,但是当我向他展示代码时,他确实试图扼杀我.我想文化冲击.
那么我们在同一个项目中使用F#和C#吗?是的,不是.不,因为我用C#重写了这个东西.是的,因为在F#中构建和测试原型比我花费更多时间将它翻译成C#LINQ风格.
我不想尝试在F#中构建所有东西,但是我耐心地等待着我可以在F#中使用混合语言解决方案的数据处理/算法部分工作的那一天,而不用担心我的生活.
你让我思考,我试着决定在哪里做.有两种情况需要考虑:
如果我正在制作城堡(MVC)项目,我可能会在C#中使用控制器,而所有BL和模型都在F#中(我倾向于进行域驱动设计并将BL连接到模型中,或通过注入组件[ala DI] )
启动一个新项目,但合并现有的库,以便不重新发明轮子.
此外,我是"工作的正确工具"的大力倡导者,所以如果我认为其中一个或更适合,我会使用它.
我们有一个应用程序通过加载MEF部件获得其所有功能.大多数部分都是用C#编写的,但有一部分是用F#编写的二进制数据处理.在这种情况下,F#更适合这项工作.
F#部分符合C#中定义的接口,C#应用程序不知道它处理F#部分(除了对fsharp.dll的依赖).
当然,这不仅仅适用于F#,如果有人想用另一种语言编写或重写一个部分(插件,模块,无论你想要什么),它将被MEF选中并提供给我们的应用程序而不需要任何缺点.
我们选择最适合解决特定问题的语言,MEF将所有细节抽象出来,因此我们无需担心.