7

我刚刚听了Chris Smith 的播客谈论 F#,他在其中谈到 F# 是一种语言,它允许您以与 C#/VB.NET不同的方式解决问题,即,而不是“推挤”你“链”一起数据转换”,以及 F# 将如何“变得像 XML”,除了您选择的语言(C# 或 VB.NET)之外,您还可以使用它以更有效的方式解决某些问题。

让我开始思考.NET 语言之间的关系,以下是我对它们的理解:

  • C# 和 VB.NET 在语法上没有本质区别,即 C# 程序员不会为了“以新的方式解决问题”而学习 VB.NET
  • 但是,C# 或 VB.NET 程序员会学习 F#,以便“以功能性方式解决编程问题”

但是IronPythonIronRuby呢?Chris 提到“F# 从 Ruby 和 Python 中学到了很多东西”,所以我认为 F# 与 IronRuby/IronPython 的关系相似,而 C# 与 VB.NET 的关系相似。然而,通过谷歌搜索告诉我IronRuby 和 IronPython 都是基于 DLR 构建的,但 F# 不是

如何最好地理解 F#、IronRuby 和 IronPython 之间的关系?

4

6 回答 6

15

从语言的角度来看,F# 和 IronPython/IronRuby 相差很远。F# 是一种函数式、高度类型化的编译语言。IronRuby/IronPython 是动态类型的解释语言。

我相信 IronPython 确实还支持编译,但我不是 100% 肯定,更不用说 ruby​​。

VB.Net 和 C# 之间的关系更加密切。

于 2009-06-10T19:59:14.877 回答
6

在许多方面,F# 和 Ruby/Python 表面上很相似。这三种语言都允许你简洁地表达想法,而不会在你的代码中乱扔多种类型。然而,F# 实际上与 Ruby 和 Python 有很大不同,因为 F# 是静态类型语言,而 Ruby 和 Python 是动态类型。惯用的 F# 代码很少提及类型,但编译器会推断类型,并且编译器会在编译期间标记任何类型错误。对于 Ruby 和 Python,使用错误类型的值只会在运行时产生错误。Ruby 和 Python 的活力意味着两者都比 F# 更适合元编程(例如,可以在运行时修改类型)。另一方面,F# 对于大多数任务(与 C# 相比)将具有更高的性能,并提供了许多不错的功能抽象,例如带有模式匹配的可区分联合。确实,学习好这些语言中的任何一种都会使您以与在 C# 或 VB.NET 中不同的方式思考问题,但您的方法在 F# 和 Python/Ruby 之间也可能会有很大差异。

于 2009-06-10T20:11:12.263 回答
5

我想说 F# 从 OCaml 中学到的东西比从 Ruby 和 Python 中学到的要多得多。唯一真正的比较是 F# 将 ML 带入 .NET,就像 IronPython/Ruby 将 Python/Ruby 带入 .NET 一样。

于 2009-06-10T20:12:36.877 回答
0

F# 更像是一种“工具”语言,其中存在最好用函数式方法解决的特定问题。F# 本质上是线程安全的,这让人希望它有助于扩展应用程序以使用多个处理器。我看到 F# 用于构建将在 VB.NET 或 C# 中用于处理特定问题的组件。

于 2009-06-10T20:00:43.423 回答
0

F# 的某些方面类似于动态语言;但是,JaredPar 的回答确实总结了这一点。F# 属于它自己的函数式编程类别,其中 IronRuby 和 IronPython 是动态语言,而 C#/VB OO 语言。他们都可以做同样的事情,只是取决于你想怎么做。对于给定的问题,每种方法都有其优点和缺点。

于 2009-06-10T20:04:56.097 回答
0

注意:这主要是我对该主题的想法和观察的汇编。我白天是 C# 程序员,晚上是 Python。

是的,我同意已经说过的一些内容,但是我有一些时间,并且想详细说明和分享我的想法。

F# 是一种函数式语言。这意味着你真的更关心动词。它仍然是静态类型的并在 CLR 上运行,但是您以不同的方式构建代码并以不同的方式解决问题。通常人们认为函数式语言在结构上更数学化,更容易形式化证明。当然,这通常被认为主要是学术性的。

C# 和其他静态类型的 OO 语言确实更侧重于名词,以进一步进行我的类比。因此,您可以构建代码并解决与此相关的问题。当然,维护状态和对对象使用非确定性方法也存在自然问题,这些问题往往在 OO 语言中出现得更频繁。

当然,F# 有一些从 OO 语言中借来的特性和思想,而 C# 有一些从函数式语言中借来的思想和特性。

比较 Python 和 C# 更多的是关于动态类型和静态类型之间的区别(尽管 python 确实提供了一些 C# 仍然没有的功能特性)。动态类型通常更容易处理自省/反思活动和运行时修改,同时增加了由于“常规”代码中使用的拼写错误或不正确对象而导致运行时错误的风险。

静态语言通常有一些动态语言没有的开发人员开销。开销似乎通常是由于必须创建层来抽象事物并创建继承层次结构和接口来处理所需/想要的抽象。由于您试图避免对类型的依赖。

似乎静态语言在较大的团队中更容易管理。此外,您还可以使用所有检查和工具轻松获得重构的优势。

于 2009-08-19T20:33:05.773 回答