不需要学习C#,从F#开始学习.NET技术

18

我是一名Java/C++开发人员,从未花时间学习C#和相关的.NET基础知识。

后来因为我的硕士论文需要,我学习了OCaml,然后听说了F#并想知道:F#是否能让我轻松地使用.NET API构建完整功能的应用程序(可能涉及GUI、套接字等)而不会出现任何问题?

我这样问是因为F#语法和概念与OCaml非常相似,只有在使用更多的面向对象方法时它们之间存在差异,所以Java的知识可以帮助我填补这个空缺。如果F#能够使用与C#相同的资源而不需要学习C#语法,那么我真的会考虑尝试一下。这值得一试吗?

此外,亚马逊上有关F#的书籍(主要是一本来自O'Reilly和3-4本来自Apress)是否有助于学习高级技术?因为我现在很喜欢函数式编程,但从未在.NET平台上工作过,所以我真的不知道该从哪里开始。

提前致谢。


5
如果您已经了解Java,那么学习C#语法应该不会太难。有关在F#中进行图形用户界面编程的信息,请参阅此帖子https://dev59.com/q3E85IYBdhLWcg3wZymt - Longball27
1
我不想仅仅因为发现了函数式编程就选择C#,我希望能够从这个角度深入了解.NET。 - Jack
我理解并同情你的观点,我相信你会喜欢F#(它实际上是基于OCaml的,甚至有一个OCaml兼容模式)。但我想指出的是,C#支持完整闭包和一阶函数,并且即使在那里也可以以非常函数式的风格进行编程。唯一让我感到遗憾的是,在这样做时我错过了类型推断。 - harms
9
我不同意仅有的C#函数式编程缺失是类型推断。C#缺少一个可组合的类型系统(即委托具名类型而不像F#函数类型那样结构化类型),void在C#中不是一个合适的类型,C#将语句和表达式区分开,在使用函数式编程风格时可能会遇到困难。此外,C#缺少具有复制和更新语义以及联合类型的记录,这些也很重要。Tomas的书很好地解释了为什么这些东西很重要:http://www.manning.com/petricek/ - Robert
2
虽然不是严格的函数式编程,但C#缺乏模式匹配令人非常失望。 - pblasucci
显示剩余2条评论
6个回答

14

如果您已经掌握了一些其他语言,像您所说的那样,《Expert F# 2.0》(Don Syme著)是一个深入了解F#的绝佳选择。

通常,您会在学习库方面遇到困难,但MSDN参考资料相当不错。

我认为这绝对值得尝试。除了对框架有经验之外,掌握C#不会给您带来太大的优势。


+1 - 《Expert F#》是我去年读过的最有趣的书。 - Alex Humphrey

7
F#是否允许我轻松使用.NET API构建完整功能的应用程序(可能涉及GUI、套接字等),而不会出现任何问题?
我希望能看到几个不同的观点;我将提供我的观点。
一个“语言”有几个方面影响了你使用它构建“完整功能”的应用程序的易用性/流畅性:
- 语言本身 - 它所配对的库/框架 - 工具能力(IDE集成) - 外部支持(示例,第三方库,社区)
F#是一种非常棒的语言,其核心基于OCaml。它与C#共享相同的库/框架(.NET),因此在前两个方面上,F#与C#一样适合构建这样的应用程序。
然而,F#比C#年轻了几年,因此Visual Studio工具和社区/示例都没有C#那么成熟。目前,在VS中,支持F#的“项目模板”和“设计器”较少,而且很难找到示例/库。F#社区非常出色,并且正在快速填补第四个方面(甚至是第三个方面)的空缺,但是对于依赖于上述第三和第四方面的应用程序,C#今天(2010年7月)仍然具有优势。是的,你今天可以使用F#构建任何你想要的东西,但在某些情况下,C#的端到端体验仍然会更加流畅/易用。

5
在我的经验中,学习F#需要一些C#,尤其是对于.Net部分。与你的情况类似,我在学习F#之前不了解任何.Net和C#。对我来说,第一个难点是异步IO编程。直到我阅读CLR via C#的异步章节后,我才完全理解它。我很快发现,咬我的不是计算表达式/单子,而是.NET。然后我继续阅读CLR via C#,例如我知道在.Net中1D数组是高效的,但2D数组并不那么高效。我还了解了.Net中的委托和事件。.Net是命令式的,C#是.Net的母语。在我看来,学习C#(至少阅读C#)是F#程序员所必需的。

3
在Visual Studio中,F#仍然缺少帮助自动化用户界面设计过程的工具。在C#的情况下,这些工具相当复杂,但在F#中,您必须手动完成所有的管道工作。因此,如果您的目标是学习制作WPF(等)应用程序,则C#目前是更好的选择。如果您的目标是学习.NET、WPF(等)的机械细节,则任何一种语言都可以。
在我看来,甚至更好的方法是同时学习F#和C#。您对Java和OCaml的经验为学习C#和F#提供了良好的起点。使用C#来处理UI,使用F#来处理底层工作。

你的意思是说可以轻松地混合使用C#和F#,让C#负责GUI(例如),而F#用于程序逻辑?它们可以无缝地互相接口吗? - Jack
@Jack “无缝”可能有点过于强烈了。你需要将你的F#代码保持在一个独立的程序集(就像Java的包)中,与你的C#和GUI分开。你还可能会在两种语言接口处面临一些小挑战。 - Mike Schenk
有一些 F# 功能是专门设计用于该语言的,从 C# 使用起来很困难,但 F# 是一个完整的 .NET 语言。因此,编写类和函数看起来与任何其他 .NET 语言(无论是 C#、MC++ 还是 VB)引用的函数没有什么区别,相当简单。这些功能的可移植部分相当容易学习和掌握。F# 书籍或在线 F# 示例将提供混合使用 F# 和 C# 的示例。也许不是完美无缝,但至少是毫不费力的无缝,哈哈。 - TechNeilogy
+1 同意
  1. 微软实际上推荐使用 C#(而不是 F#)来开发 Web 和桌面前端,因为它有更好的设计支持。
  2. 每当你在网上搜索特定的 .Net 问题解决方案时,你很可能会得到一个 C# 的解决方案。通常情况下,直接复制粘贴比翻译成 F# 更容易。
- Stephen Hosking

1
简单的答案是:“是的”,F#可以完全访问所有.NET库,并且可以消耗和生成使用任何其他.NET语言编写或为其编写的代码,以及直接与COM和本地DLL进行交互。
话虽如此,F#的工具支持不像C#那样成熟。虽然您可能会发现使用C#学习.NET会更容易一些,但从F#开始并不会受到固有的限制。
最重要的是,GUI构建器目前无法生成F#代码,不能生成强类型的ASP.NET代码后台页面(但可以创建弱类型的),而且没有直接支持在F#中创建测试的功能(但存在插件可以实现)。
但是,人们可以轻松地手动编写F# GUI代码,这通常比等效的C#更容易且更简洁。例如,属性可以在构造函数上设置;例如,let f = new Form(Text="Window Title"),并且lambda函数会自动转换为委托;例如,event.Add( fun e -> doSomething() )。

还可以创建用于描述 UI 的 DSL。有关更多信息,请参见F#: is there no UI (like WPF) for it?

TechNeilogy 指出的建议风格是将 F# 中的逻辑编写为库,并从 C# 创建的 GUI 中调用该库。


哦,而且F#对于编写异步和并行代码的支持非常出色。在我使用过的任何其他语言中,使用F#编写正确的非阻塞IO都要容易得多。 - James Hugard
“与任何东西进行接口”中的一个例外是,目前没有语言级别的支持来处理在IronPython或IronRuby中创建的动态对象。虽然可能可以与这些对象进行接口,但这并不像使用VB或C#那样容易。 - James Hugard

1

我会说“不”。学习F#的挑战在于改变你的编程思维方式,递归、高阶函数、模式匹配等。非常重要的是,你需要以“函数式”的方式来思考编程,而不是像C#或Java那样命令式。学习API总是很容易,但学习如何设计应用程序却不是。

这就是我的看法。


1
只是想指出,原帖的作者已经了解OCaml语言,这是F#的姊妹语言,因此用大部分兼容的F#编写代码不应该构成任何挑战。 - James Hugard

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