F#在哪些领域“绝对没有意义”?

时间:2011-03-12 13:31:46

标签: c# oop f# functional-programming

Don Syme在他的SPLASH演讲中表示,尽管F#具有一般功能,但它并不打算成为C#的替代品。他继续说F#在使用方面没有任何意义,但没有扩展到论文。

  1. 有人可以告诉我在使用F#时应该避免哪些方面?
  2. 您还可以提到C#闪耀的区域。
  3. 相关问题:

    In what areas might the use of F# be more appropriate than C#?

9 个答案:

答案 0 :(得分:59)

我认为将语言替换为C#的丰富和成熟将是非常昂贵的。因此,例如,目前,如果使用Visual Studio WinForms设计器可以为您提供优势,C#绝对是WinForms开发的最佳选择:F#没有WinForms设计器。

C#目前还支持更好的LINQ-to-SQL。我确信这些方面还有很多其他的例子。

然后需要整个C#熟练的劳动力将他们的技能更新为F#,同时保留C#技能以维护应用程序,同样昂贵。

最后,C#是一种优秀的语言,具有很多强大的功能,有些F#甚至不具备co / contra变体泛型,并且对DLR的动态编程提供开箱即用的支持(F#只有一个未实现的运算符)

因此,不期望F#取代C#,F#可以以新的方式发展,而不是花时间在已经很好覆盖的区域内进行追赶。

答案 1 :(得分:23)

这是一个棘手的问题,因为它不是很合格。您是在谈论语言,还是在谈论语言以及当前的IDE支持?或者你是在谈论使用F#给出可用的库?

  • 一般语言 - 我不认为有些地方使用F#绝对是胡说八道。对于完全托管的操作系统(例如Singularity)进行系统编程会很棒,我认为功能程序更容易正式验证(这对操作系统来说可能是个大问题)。对于低级嵌入式系统,您可以使用元编程和面向语言的设施(例如,模拟硬件中的信号流等)。

  • 当前IDE的语言 - 当前的F#IDE有一些限制 - 它不适用于WinForms设计器(但它适用于Blend和WPF)。

  • 给予开发人员教育的语言 - 雇用F#程序员比雇用C#程序员更难。如果您正在创建一些没有任何复杂核心的应用程序(例如通常的“数据库接口”),那么在C#中开发它会更便宜(如果您可以聘请优秀的F#开发人员,他们可能会更快地完成它并且更少错误,但可能不值得花费。)

  • 提供可用库的语言 - 如果您想限制自己使用F#只使用适合它的库,那么域会缩小一点。例如,LINQ to SQL和ASP.NET MVC可以与F#一起使用,但它并不完美。但是,对于许多项目来说,开发自己的库是有意义的,然后F#就成了很好的语言。

答案 2 :(得分:16)

好问题。我会说开发人员,经理和客户都有零语言原因和许多不幸的技能,能力和态度原因。

答案 3 :(得分:10)

许多Microsoft的UI技术(如WPF)都非常支持数据绑定。当用户与UI交互时,有效数据绑定使用双向绑定来更新基础对象。这意味着有效数据绑定需要可变对象

F#,强调不可变类型,与这种类型的数据绑定模型非常不匹配。虽然可以在F#中创建可变类型,但这样做会从语言中消除很多好处。使用可变性更自然的语言(例如C#)更有意义。

答案 4 :(得分:8)

您可能需要考虑将其用于操作系统内核开发或低级嵌入式系统: - )

答案 5 :(得分:5)

如果您愿意放弃特定于C#的工具,并且支付适用的任何采用成本,则没有特定的区域F#至少不如C#那样有能力。

答案 6 :(得分:4)

框架中的Web应用程序,例如ASP.NET MVC更适合C#。 “绝对没有意义”是一个极端,我会说“在正常情况下。”

当然,它可以用于Web应用程序引用的库,但不能用于实际的应用程序本身。

答案 7 :(得分:4)

嗯,冒着说明显而易见的风险,F#首先是一种函数式编程语言,而F#中的OOP编程可能是一个痛苦的问题。因此,如果你正在处理一个最好用OOP表达的问题,我想使用C#确实更有意义。

相互递归的类型和接口的显式实现是我头脑中为什么F#中的OOP可能很麻烦的第一个例子。

(通常引用的)“用OOP表达最好的问题”的例子是创建一个UI库。你有许多小部件,它们封装了自己的状态,你想让他们做一些像“自己画”多样化的东西(甚至是一个单词?)

答案 8 :(得分:3)

在Visual Studio(ASP.NET,WebForms,WPF等)和第三方工具完全支持f#之前,f#将始终是二等公民。

让我们面对现实,与实​​体库相比,语言选择通常对生产力没有太大影响(.NET,c#和f#都可用 - 这里没有优势),IDE(intellisense,语法着色,等),(据我所知,只有部分支持f#...例如没有Razor支持),以及第三方工具(例如resharper)。

因此,考虑到这一点,我认为任何人都不能建议完全替换c#,直到所有这些工具都适用于f#。一个很好的折衷方案是在类库中使用f#并继续在前端使用c#。