选择使用C#还是F#?在这个“现实世界”的案例中。

3

我在stackoverflow上读到了几篇有趣的C# / F#比较。首先,感谢所有贡献者!

有很多对F#的赞扬,但是更难找到偏爱C#的原因。无论如何,对于这个小而简单的“真实世界应用程序”:模拟一群鲱鱼,我仍然不确定该选择哪一个。

我不知道函数式编程(尚未),但从面向对象的角度来看,设计中有一些直观的想法:创建一个Fish类,并从中派生这些类:Herring,Predator,Prey。每个类都应具有诸如位置、方向和速度之类的属性。

将会有大量遍历集合:每个Fish对象在每个小时间增量时都将检查其环境并更新其动作。

我还不确定这是否足够CPU密集,以至于我关心多处理,但也许F#听起来不错。

我确信我将花费大量时间进行原型和探索 - 我听说F#在这方面很好。

从我所读的内容来看,C#对GUI更好,但是不会有太多GUI。绘制一些曲线很好,但我更喜欢将大部分结果发送到打开的Excel工作表或数据库中。不确定C#和F#在Excel /数据库方面的差异如何。

无论如何,这个项目似乎非常面向对象 - 尽管上面提到了F#的优点,C#是否对这个项目更好?还是其他选择?

编辑:只是想感谢所有评论,非常有用和有趣,希望也能帮助别人。我发现有趣的一件事是,尽管F#是多范式的,但每个人似乎都更喜欢C#的面向对象方法,尽管例如此比较

(顺便说一下,我要学习F#。)


1
可能是在哪些领域中使用F#比C#更合适?的重复问题。 - Mauricio Scheffer
9
项目并非面向对象的,你的思维是面向对象的,因为你还没有其他工具。学习函数式编程,你将拥有一种不同思考问题的工具。 - Mauricio Scheffer
4个回答

15

你完全可以使用F#编写算法代码,同时使用C#编写GUI界面。只需将算法放入使用F#编写的库中,在C#中编写GUI应用程序时引用该库即可。


4
听起来这是一个很好的机会,可以尝试将它们混合在一起或者完全使用两种语言编程,这样你就可以体验到它们之间的差异并学习函数式和面向对象编程的区别。顺便说一下,由于F#是一种混合语言,因此您可以在其中进行面向对象编程,而您也可以在C#中进行函数式编程,当然有限制。另外,您不应该在任何一种语言中遇到真正的数据库访问或Excel集成问题。

4
这似乎是一个可以使用两种风格编写的应用程序。使用F#似乎很合适,这可能是学习F#语言和函数式编程的好应用程序。
关于架构,您写道:
“我还不了解函数式编程,但从面向对象的角度来看,一些设计似乎很简单:创建一个Fish类,并从中派生这些类:Herring、Predator、Prey。每个类都应该有位置、方向和速度等属性。”
函数式编程并没有太大的不同。它强调使用具体类型(通常不使用继承),因此您可能会定义类似属性的HerringPredator等不同类型。然后,您将创建鲱鱼列表和捕食者列表,并分别对这两种类型进行逐步模拟。
恰巧,我在我的函数式编程书籍中写了一个类似的模拟器,其中使用了“动物”和“捕食者”作为样本(使用C#和F#)。源码可免费获取 (请查找第14章),因此您可能会发现它是一个有用的灵感来源(该示例还演示了并行性)。从F#中使用Excel也完全可行(与C#完全相同),我的书中也提供了示例(请参见第13章的源代码)。一般来说,使用功能编程在F#中解决问题需要略微不同的视角,您可能需要花费更多的时间进行实验,但是这个问题似乎可以很好地受益于一些F#特性(这也是学习新知识的好机会)。

谢谢你的回答,也感谢你提到你的书,我一定会去看看! - user427919

3

我犹豫不决。

如果你想要一个面向对象的解决方案来进行模拟(正如你提问时的暗示),那么C#自然是更好的工具,因为它天生就是面向对象的。

但是,如果你愿意考虑一个函数式的解决方案,那么你会发现F#更好 - 因为它本质上是函数式的。


2
我跟Bevan一样,我是一位像OP一样的C#面向对象开发人员。如果你试图以面向对象的方式实现F#,并且像我一样,你会感到沮丧,并回归到C#,因为你熟悉它。花时间学习函数式编程,直到你有了第一个小的“惊喜”时刻,你会完全不同地处理项目,而且你不会冒写出F#语法的C#代码的风险,错过了F# /函数式编程的所有美好体验。 - jdoig
我想补充一点,即使最好的面向对象编程(OOP)方案也不需要在真实世界对象(例如鱼)和软件对象之间建立映射——虽然它可以这样做。先解决问题本身,再决定使用OOP、FP或其他任何方式来更好地表达该解决方案。(在这种情况下,如果您确实需要性能,那么并行数组可能比纯OOP或纯FP更好的解决方案。) - TechNeilogy
2
这是有争议的。F# 本质上也是“面向对象”的 - 在某些方面甚至比 C# 更加如此,因为它具有一些有趣的面向对象特性,例如匿名对象(它们对于类来说就像 Lambda 对于函数类型一样)。 - Pavel Minaev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接