从没有 C# 的 F# 学习 .NET

Posted

技术标签:

【中文标题】从没有 C# 的 F# 学习 .NET【英文标题】:Learning .NET from F# without C# 【发布时间】:2011-03-16 11:30:01 【问题描述】:

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

然后我学习了 OCaml,因为我必须将它用于我的硕士论文,所以我听说了 F# 并想知道:F# 是否允许我轻松使用 .NET API 来构建功能齐全的应用程序(可能涉及 GUI、套接字等) ) 没有任何问题?

我问这个是因为 F# 语法和概念似乎与 OCaml 非常相似,而当它们不同时,只是因为使用了更多的 OOP 方法,因此 Java 知识将帮助我填补这个漏洞。如果 F# 能够使用与 C# 相同的资源,而无需学习 C# 语法我真的会考虑.. 值得尝试吗?

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

提前致谢

【问题讨论】:

如果您已经了解 Java,那么学习 C# 语法应该不会太难。有关 F# 中的 GUI 编程的信息,请参阅这篇文章***.com/questions/2796272/… 我不想仅仅因为我发现了函数式编程而选择 C#,并且我想从这个角度深入研究 .NET.. 我理解并赞同你的观点,我相信你会喜欢 F#(它实际上是基于 OCaml,甚至还有 OCaml 兼容模式)。但我只想指出,C# 支持完全闭包和一阶函数,即使在那里也可以以非常实用的风格进行编程。这样做时我唯一想念的就是类型推断。 我不同意 C# 函数式编程中唯一缺少的就是类型推断。 C# 缺少可组合的类型系统(即委托是名义上的类型,而不是像 F# 函数类型那样的结构类型), void 在 C# 中不是合适的类型,并且 C# 将语句和表达式分开,这在以 FP 风格编程时会咬你.此外,C# 缺少具有复制和更新语义以及联合类型的记录,这在函数式编程中也很重要。 Tomas 的书很好地解释了为什么这些事情很重要:manning.com/petricek 而且,虽然不是严格意义上的 FP,但 C# 缺乏模式匹配是一个巨大的失望。 【参考方案1】:

如果您已经像您所说的那样了解几种语言,那么 Don Syme 的 Expert F# 2.0 是对 F# 的深入了解。

大多数情况下,您会在学习库方面遇到困难,但 MSDN 参考非常好。

我认为这绝对值得一试。除了框架方面的经验之外,了解 C# 不会给您学习 F# 带来任何好处。

【讨论】:

+1 - Expert F# 无疑是我去年读过的最有趣的书。【参考方案2】:

将 F# 允许我轻松使用 .NET API 构建全功能 应用程序(可能涉及 GUI, 插座,无论如何)没有任何 有问题吗?

我希望在这里看到一些不同的观点;我会提供我的。

“语言”有几个方面会影响您使用它构建“功能齐全”的应用程序的难易程度:

语言本身 与之配对的库/框架 工具功能(IDE 集成) 外部支持(示例、第三方库、社区)

F# 是一门很棒的语言,其核心基于 OCaml。它与 C# 共享相同的库/框架 (.NET),因此就前两个项目符号而言,F# 与 C# 一样能够构建此类应用程序。

尽管 F# 比 C# 早了很多年,所以 Visual Studio 工具和社区/示例都没有 C# 成熟。目前,在 VS 框中使用 F# 的“项目模板”和“设计器”较少,并且更难找到示例/库。 F# 社区很棒,并且正在迅速开始填补第 4 条(甚至是第 3 条中的一些)的漏洞,但是对于构建严重依赖上述第 3 条和第 4 条的应用程序,C# 在今天仍然具有优势(2010 年 7 月)。是的,您现在可以使用 F# 构建您喜欢的任何东西,但仍然存在使用 C# 的端到端体验会更顺畅/更轻松的情况。

【讨论】:

【参考方案3】:

根据我的经验,你需要一些 C# 来学习 F#,尤其是 .Net 部分。

与您的情况类似,在学习 F# 之前,我不知道任何 .Net 和 C#。对我来说,第一个困难的部分是异步 IO 编程。在阅读CLR via C# 的异步章节之前,我对它有一个全面的了解。我很快发现让我感到困扰的不是计算表达式/单子,而是.NET。然后我继续通过 C# 读取 CLR,例如我知道在.Net 中一维数组是有效的,但是二维数组不是那么有效。我还了解了 .Net 中的代表和事件。

.Net 势在必行。 C# 是 .Net 的母语。恕我直言,F# 程序员需要学习 C#(至少阅读 C#)。

【讨论】:

【参考方案4】:

Visual Studio 中的 F# 仍然缺少一个工具,这些工具有助于自动化用户界面设计过程。这些在 C# 的情况下非常复杂,但在 F# 中,您必须手动完成所有管道。因此,如果您的目标是学习制作 WPF(等)应用程序,C# 目前是更好的选择。如果您的目标是学习 .NET、WPF(等)的机械细节,任何一种语言都可以。

在我看来,更好的方法是同时学习 F# 和 C# 两者。您在 Java OCaml 方面的经验让您在 C# 和 F# 方面都有一个良好的开端。使用 C# 处理 UI,使用 F# 完成底层工作。

【讨论】:

你的意思是可以很容易地混淆C#和F#,让C#关心GUI(例如),而F#用于程序逻辑?他们可以无缝地相互连接吗? @Jack “无缝”这个词可能有点太强了。您需要将 F# 保存在与 C# 和 GUI 不同的程序集中(如 Java 包)。您还可能会面临一些小挑战,因为这两者会相互影响。 有一些 F# 功能是专门为使用该语言而设计的,很难从 C# 中使用,但 F# 是一种成熟的 .NET 语言。因此,编写看起来与来自任何其他 .NET 语言(无论是 C#、MC++ 还是 VB)的引用函数没有什么不同的类和函数是相当简单的。该功能的可移植部分非常易于学习和保持直截了当。 F# 书籍或在线 F# 示例将提供混合 F# 和 C# 的示例。也许不是完美无缝,但至少无缝无缝,哈哈。 +1 同意 1. 由于设计器支持,Microsoft 实际上推荐 C#(而不是 F#)用于 Web 和桌面前端。 2. 每当您在网上搜索特定 .Net 问题的解决方案时,您很可能会得到 C# 解决方案。剪切和粘贴通常比翻译成 F# 更容易【参考方案5】:

简单的答案是:“是的”,F# 可以完全访问所有 .NET 库,并且可以使用和生成用任何其他 .NET 语言编写的代码,以及直接与 COM 和本机 DLL 接口。

也就是说,F# 的工具支持不如 C# 成熟。虽然您可能会发现使用 C# 学习 .NET 会更容易一些,但您不会因从 F# 开始而受到固有的限制。

最重要的是,GUI 构建器目前无法生成 F# 代码,无法生成强类型 ASP.NET 代码隐藏页面(但可以创建弱类型页面),并且不直接支持在 F# 中创建测试(但存在插件哪个)。

但是,使用 F# 可以轻松地手动编写 GUI 代码,而且这样做通常更容易,并且比等效的 C# 更简洁。例如,可以在构造函数上设置属性;例如,让 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 比我使用过的任何其他语言都容易 “与任何事物的接口”的一个例外是,目前没有语言级别的支持在 IronPython 或 IronRuby 中创建的动态对象。虽然可以与此类对象进行交互,但这并不像使用 VB 或 C# 那样简单。【参考方案6】:

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

这是我的 2 美分。

【讨论】:

只是指出,OP 已经知道 OCaml,它是 F# 的姊妹语言,因此在很大程度上兼容的 F# 中编写代码应该不会构成任何挑战。

以上是关于从没有 C# 的 F# 学习 .NET的主要内容,如果未能解决你的问题,请参考以下文章

当.NET遇到机器学习

C# 学习经验分享

如何从没有绑定源 C# 生成的 datagridview 中检索数据源?

C#持续学习

C#的学习网站

C#光速学习