使用C#vs F#或F#vs C#有什么好处?

gra*_*bot 93 .net c# f#

我为一家技术公司工作,该公司比产品发货做更多的原型设计.我刚才被问到C#和F#有什么区别,为什么MS创建F#以及它会比C#更好.

我一直在使用这种语言,我喜欢它,所以我可以很容易地继续讨论F#的强大功能,但是我缺乏C#的经验来说明为什么我们应该使用它而不是另一种.

使用C#vs F#或F#vs C#有什么好处?

Dar*_*rio 86

函数式编程对命令式语言的一般好处:

您可以更容易地表达许多问题,更接近它们的定义,并且在函数编程语言(如F#)中更简洁,并且您的代码不易出错(不变性,更强大的类型系统,直观的重复算法).您可以编写您的意思而不是计算机想要您说的内容;-) 当您谷歌搜索或甚至搜索它时,您会发现许多这样的讨论.

特殊F# - 优点:

  • 使用--expressions异步编程非常简单直观- 即使使用ParallelFX,相应的C#代码也要大得多async {}

  • 编译器编译器和特定于域的语言非常容易集成

  • 根据需要扩展语言:LOP

  • 计量单位

  • 语法更灵活

  • 通常更短,更优雅的解决方案

看一下这个文档

C#的优点在于它通常比"命令式"应用程序(用户界面,命令式算法)更精确,而不是函数式编程语言,它使用的.NET框架必须设计并且更广泛.

此外,您可以在一个解决方案中同时使用F#和C#,因此您可以结合两种语言的优点并在需要的地方使用它们.

  • 它们以非常奇怪的方式结合在一起.例如,您可以在F#中重载>运算符.然后C#开发人员可以使用它.但是,F#开发人员不能.没错,F#可以发出它无法消耗的运算符重载. (16认同)

Rex*_*x M 36

这就像问一把锤子比螺丝刀有什么好处.在极高的水平上,两者基本上都是相同的,但在实施层面,为您要完成的任务选择最佳工具非常重要.在c#中有一些困难和耗时的任务,但在f#中很容易 - 就像试图用螺丝刀敲钉子一样.你可以做到这一点,当然 - 这并不理想.

数据操作是我个人可以指出的一个例子,其中f#真正闪耀,而c#可能很笨拙.另一方面,我会说(一般来说)复杂的有状态UI在OO(c#)中比在函数(f#)中更容易.(可能会有一些人不同意这一点,因为它现在很"酷"以"证明" 在F#中做任何事情是多么容易,但我坚持这一点).还有无数其他人.

  • 如果你拥有的只是锤子,那么一切看起来都像钉子.-Maslow (22认同)
  • 我不打算对此进行投票,因为除了一个数据示例之外,它没有给出任何真实的细节.我知道它们是不同的工具.我问这两种工具相比之下哪些工作最好,最差.我知道飞利浦通常是最好的工具,即使较小的扁平头也可以工作. (20认同)
  • 如果你拥有的只是一把锤子,那么它就像一个拇指. (14认同)
  • 我同意gradbot,这是一个很好的答案,因此没有我的支持,但它并没有真正得到原始问题的具体细节.这个答案只是一个模糊的概念解释,但确实错过了回答这个问题的重点. (6认同)
  • 如果他不愿意投票,我会.:P +1 (3认同)

Rin*_*lin 27

  • F#在数学方面比C#具有更好的性能
  • 您可以在与C#相同的解决方案中使用F#项目(并从一个调用到另一个)
  • F#非常适合复杂的算法编程,金融和科学应用
  • F#在逻辑上非常适合并行执行(在C#上执行F#代码比在C#上更容易执行)

  • 关于F#在数学方面比C#有更好的表现:显然,这不是真的.见http://thoughtfulcode.wordpress.com/2010/12/30/is-f-math-really-faster-than-c/ (6认同)
  • @Joh:`inline`是一个明显的例子,可以在F#中提供C#无法表达的大量性能改进. (3认同)

Mic*_*lGG 27

按照我的理解回答你的问题:为什么要使用C#?(你说你已经在F#上卖了.)

首先.这不仅仅是"功能与OO".这是"功能+ OO与OO".C#的功能非常简陋.F#不是.同时,F#几乎完成了C#的所有OO功能.在大多数情况下,F#最终成为C#功能的超集.

但是,在某些情况下,F#可能不是最佳选择:

  • 互操作.有很多库不会对F#感到太舒服.也许他们利用某些C#OO,F#不会做同样的事情,或者他们可能依赖于C#编译器的内部.例如,表达式.虽然您可以轻松地将F#引用转换为表达式,但结果并不总是与C#完全相同.某些库存在此问题.

    • 是的,互操作是一个非常大的网络,可能会导致与一些库的一些摩擦.

    • 如果你有一个庞大的现有代码库,我认为interop也包括在内.刚开始用F#编写部件可能没有意义.

  • 设计工具.F#没有.并不意味着它没有任何东西,但就在现在你不能用F#codebehind掀起一个WinForms应用程序.即使在支持它的地方,例如在ASPX页面中,您也不会获得IntelliSense.因此,您需要仔细考虑生成代码的边界.在一个几乎完全使用各种设计师的非常小的项目中,使用F#作为"胶水"或逻辑可能是不值得的.在较大的项目中,这可能不再是一个问题.

    • 这不是一个固有的问题.与Rex M的答案不同,我没有看到任何关于C#或F#的固有内容,这使得他们更好地使用大量可变字段来创建UI.也许他指的是必须编写"可变"并使用< - 而不是=的额外开销.

    • 还取决于使用的库/设计师.我们喜欢将ASP.NET MVC与F#一起用于所有控制器,然后使用C#web项目来获得ASPX设计人员.我们在C#和F#之间混合了实际的ASPX"代码内联",具体取决于我们在该页面上需要什么.(IntelliSense与F#类型.)

  • 其他工具.他们可能只是期待C#而不知道如何处理F#项目或编译代码.此外,F#的库不作为.NET的一部分提供,所以你需要额外的东西.

  • 但头号问题?人.如果你的开发人员都没有想要学习F#,或者更糟糕的是,难以理解某些方面,那么你可能会敬酒.(虽然,在这种情况下,我认为你无论如何都要干杯.)哦,如果管理层说不,那可能就是一个问题.

我刚才写过这篇文章:为什么不是F#?


Spe*_*ort 6

您要求在过程语言和函数式语言之间进行比较,因此我觉得您的问题可以在这里得到解答:过程式编程和函数式编程之间有什么区别?

至于MS创建F#的原因,答案很简单:创建一个可以访问.Net库的功能语言,只是扩大了他们的市场基础.看看语法与OCaml几乎完全相同,它实际上并不需要太多的努力.


Jer*_*ink 5

如果你把它与C#,C++,VB进行比较,F#还不是另一种编程语言.C#,C,VB都是命令式或过程式编程语言.F#是一种函数式编程语言.

函数式编程语言的两个主要好处(与命令式语言相比)是1.它们没有副作用.这使得关于程序属性的数学推理变得更加容易.2.职能是一等公民.您可以将函数作为参数传递给其他函数,就像其他值一样容易.

命令式和函数式编程语言都有其用途.虽然我还没有在F#中做过任何认真的工作,但我们目前正在基于C#的一个产品中实现一个调度组件,并且将通过在F#中编写相同的调度程序来进行实验,以查看是否正确.与C#等价物相比,可以更容易地验证实现.

  • -1.F#是一种多范式(OO + FP)语言.只有**纯粹的**函数语言没有副作用(如Haskell),但F#并不纯粹. (4认同)

Jon*_*len 5

F#本质上是函数式编程语言的C++.他们保留了几乎所有来自Objective Caml的内容,包括非常愚蠢的部分,并将它放在.NET运行时的顶部,以便它从.NET中引入所有不好的东西.

例如,使用Objective Caml,您将获得一种null,即<T>选项.使用F#,您将获得三种类型的null,选项<T>,Nullable <T>和引用空值.这意味着如果你有一个选项,你需要先检查它是否为"无",然后你需要检查它是否是"Some(null)".

F#就像旧的Java克隆J#,只是一种吸引注意力的混淆语言.有些人会喜欢它,其中一些人甚至会喜欢它,但最终它仍然是一个20年前的语言加入CLR.

  • FWIW,我已经在F#专业编写了几年(比世界上几乎任何其他人都长)并且我从未在任何F#代码中看到过这个问题或代码`Some null`.在人们可能抱怨的所有事情中,这必须是*waaay*在列表中... (12认同)
  • +1,这可能是一个冷酷的事实但是我仍然很高兴我可以在VS中使用函数式语言 (2认同)

Joh*_*Joh 5

我最喜欢.NET的一个方面是泛型.即使您在F#中编写过程代码,您仍然可以从类型推断中受益.它使编写通用代码变得容易.

在C#中,您默认编写具体代码,并且必须进行一些额外的工作来编写通用代码.

在F#中,默认情况下编写通用代码.在F#和C#中花了一年多的编程后,我发现用F#编写的库代码比我在C#中编写的代码更简洁,更通用,因此也更加可重用.我错过了很多在C#中编写通用代码的机会,可能是因为我被强制类型注释所蒙蔽.

然而,根据一个人的品味和编程风格,有可能使用C#.

  • C#不会在类型之间强加声明顺序,并且它对编译文件的顺序不敏感.
  • 由于类型推断,C#有一些F#无法承受的隐式转换.