我在 Internet 上搜索了F#和Haskell之间的比较,但没有找到任何真正确定的东西。主要区别是什么?为什么我要选择其中一个?
5 回答
Haskell 是一种“纯”函数式语言,而 F# 同时具有命令式/OO 和函数式语言的方面。Haskell 也有惰性求值,这在函数式语言中相当少见。
这些东西是什么意思?纯函数式语言,意味着没有副作用(或在调用函数时共享状态发生变化),这意味着您可以保证,如果您调用 f(x),除了从函数返回值之外,不会发生其他任何事情,例如控制台输出、数据库输出、对全局或静态变量的更改……虽然 Haskell 可以有非纯函数(通过 monad),但它必须通过声明“显式”隐含。
纯函数式语言和“无副作用”编程最近受到欢迎,因为它非常适合多核并发,因为在没有共享状态而不是无数锁和信号量的情况下更难出错。
延迟评估是在绝对必要之前不对函数进行评估的地方。这意味着在不需要时可以避免许多操作。在一个基本的 C# if 子句中考虑这一点,例如:
if(IsSomethingTrue() && AnotherThingTrue())
{
do something;
}
如果IsSomethingTrue()
为假,则AnotherThingTrue()
永远不会评估方法。
虽然 Haskell 是一种了不起的语言,但 F# 的主要优点(暂时)是它位于 CLR 之上。这使它适合多语言编程。有一天,您可能会在 ASP.net MVC 中编写 Web UI,在 C# 中编写业务逻辑,在 F# 中编写核心算法以及在 Ironruby 中编写单元测试......所有这些都在 .Net 框架中。
收听 Simon Peyton Jones 的软件工程广播,了解有关 Haskell 的更多信息:第 108 集:Simon Peyton Jones 谈函数式编程和 Haskell
大不同:
- 平台
- 面向对象
- 懒惰
相似之处比不同之处更重要。基本上,如果您已经在 .NET 上,则应该使用 F#,否则应该使用 Haskell。此外,OO 和惰性意味着 F# 更接近您(可能)已经知道的内容,因此它可能更容易学习。
平台:Haskell 有自己的运行时,F# 使用 .NET。我不知道性能差异是什么,尽管我怀疑优化之前的平均代码大致相同。如果您需要 .NET 库,F# 具有优势。
面向对象:F# 具有 OO,并且非常小心地确保 .NET 类易于使用,即使您的代码不是 OO 也是如此。Haskell 有类型类,可以让你以一种奇怪的方式做一些类似 OO 的事情。它们就像与 Common Lisp 泛型函数交叉的 Ruby mixin。它们有点像 Java/C# 接口。
懒惰:Haskell 是懒惰的,F# 不是。懒惰带来了一些很好的技巧,并使一些看起来很慢的事情实际上执行得很快。但我发现很难猜测我的代码运行速度有多快。两种语言都允许您使用另一种模型,您只需在代码中明确说明即可。
细微差别:
- 语法:在我看来,Haskell 的语法稍微好一点。它更加简洁和规则,我喜欢在单独的行上声明类型。YMMV。
- 工具:如果您喜欢这种东西,F# 具有出色的 Visual Studio 集成。Haskell 也有一个较旧的 Visual Studio 插件,但我认为它从未退出测试版。Haskell 有一个简单的 emacs 模式,你大概可以使用 OCaml 的 tuareg-mode来编辑 F#。
- 副作用:当你改变变量时,这两种语言都非常明显。但是 Haskell 的编译器也强制你在使用它们时标记副作用。实际的区别是,当您使用具有副作用的库时,您必须更加注意。
F# 是 ML 语言家族的一部分,非常接近 OCaml。您可能想阅读有关Haskell 和 OCaml 之间差异的讨论。
一个主要的区别,可能是纯度的结果,但我很少提到,是单子的普遍使用。正如经常指出的那样,monad 几乎可以用任何语言构建,但是当它们在整个库中普遍使用并且您自己使用它们时,生活会发生很大变化。
Monad 提供了在其他语言中以更有限的方式看到的东西:流控制的抽象。它们是做各种事情的非常有用和优雅的方式,一年的 Haskell 彻底改变了我的编程方式,就像多年前从命令式编程到 OO 编程改变了它一样,或者,很久以后,使用高阶函数确实如此。
不幸的是,在这样的空间中无法提供足够的理解来让您了解其中的区别。事实上,再多的写作也做不到。你只需要花足够的时间学习和编写代码来获得真正的理解。
同样,当您与 .NET 平台/库交互时,F# 有时可能会变得稍微不那么实用或更笨拙(从函数式编程的角度来看),因为这些库显然是从 OO 的角度设计的。
因此,您可能会这样考虑您的决定:您是否希望尝试其中一种语言以获得快速、相对较小的改进增量,或者您是否愿意为更大的目标投入更多时间并获得更少的直接收益?长期。(或者,至少,如果你没有得到更大的东西,那么容易快速切换到另一个的能力?)如果前者,F#是你的选择,如果是后者,Haskell。
其他一些不相关的点:
Haskell 的语法稍微好一点,这并不奇怪,因为 Haskell 的设计者非常了解 ML。但是,F# 的“轻量级”语法在改进 ML 语法方面大有帮助,因此没有太大的差距。
在平台方面,F#当然是.NET;我不知道这在 Mono 上的效果如何。GHC 使用自己的运行时编译成机器代码,在 Windows 和 Unix 下都能很好地工作,与 .NET 相比,C++ 就是这样。在某些情况下,这可能是一个优势,尤其是在速度和较低级别的机器访问方面。(例如,我在 Haskell/GHC 中编写 DDE 服务器没有问题;我认为你不能用任何 .NET 语言做到这一点,无论如何,MS 肯定不希望你这样做。)
好吧,我想说的一个主要优点是 F# 针对 .NET 平台进行编译,这使得在 Windows 上部署变得很容易。我已经看到了使用 F# 结合 ASP.NET 来构建 Web 应用程序的示例;-)
另一方面,Haskell 已经存在很久了,所以我认为真正的语言专家群体要大得多。
对于 F#,到目前为止,我只看到了一个真正的实现,即 Singularity proof of concept OS。我已经看到了更多 Haskell 的真实世界实现。