我在互联网上搜索了 F # 和 Haskell之间的比较,但没有找到任何真正确定的东西。主要的区别是什么? 为什么我要选择其中一个?
首先,我要说的一个主要优势是 F # 编译时。NET 平台,这使得它很容易部署在窗口。我看过一些例子,解释了如何使用 F # 和 ASP.NET 结合来构建 Web 应用程序; -)
另一方面,Haskell 已经存在很长时间了,所以我认为真正精通这门语言的人要多得多。
对于 F # ,到目前为止我只看到了一个真正的实现,那就是操作系统概念的奇异性证明。我见过更多 Haskell 在现实世界中的实现。
Haskell 是一种“纯”函数式语言,其中 F # 既有命令式/面向对象语言的特点,也有函数式语言的特点。Haskell 还有惰性计算,这在函数式语言中相当罕见。
这些东西是什么意思?一个纯函数式语言,意味着没有副作用(或共享状态的变化,当一个函数被调用时) ,这意味着你可以保证,如果你调用 f (x) ,除了从函数返回一个值,没有其他事情发生,例如控制台输出,数据库输出,全局或静态变量的变化。.虽然 Haskell 可以有非纯函数(通过单子) ,但它必须通过声明“显式”隐含。
纯函数式语言和“无副作用”编程最近变得流行起来,因为它很适合多核并发,因为没有共享状态比无数的锁和信号量更难出错。
惰性求值是指在绝对需要之前不对函数求值。这意味着在不必要的时候可以避免许多操作。在基本的 C # if 子句中可以这样想:
if(IsSomethingTrue() && AnotherThingTrue()) { do something; }
如果 IsSomethingTrue()为 false,则从不计算 AnotherThingTrue()方法。
IsSomethingTrue()
AnotherThingTrue()
虽然 Haskell 是一种令人惊叹的语言,但 F # (目前而言)的主要好处是它位于 CLR 之上。这有助于通晓多种语言的编程。有一天,你可以用 ASP.net MVC 编写你的 web UI,用 C # 编写你的业务逻辑,用 F # 编写你的核心算法,用 Ironruby 编写你的单元测试... ..。所有的。网络架构。
收听软件工程西蒙·佩顿·琼斯,了解更多关于 Haskell 的信息: 第108集: 函数式编程和 Haskell 西蒙·佩顿·琼斯
F # 是 ML 语言家族的一部分,与 OCaml 非常接近。您可能想在 Haskell 和 OCaml 的区别上阅读这篇讨论。
区别很大:
相似点比不同点更重要。基本上,如果在。已经,否则 Haskell。而且,OO 和懒惰意味着 F # 更接近您(可能)已经知道的内容,因此它可能更容易学习。
平台: Haskell 有自己的运行时,F # 使用。NET.我不知道性能差异是什么,尽管我怀疑优化前的平均代码大致相同。如果您需要。NET 库。
面向对象: F # 具有 OO,并且非常小心地确保。NET 类很容易使用,即使您的代码不是 OO。Haskell 有一些类型类,可以用一种奇怪的方式执行类似于 OO 的操作。它们就像是与 Common Lisp 通用函数交叉的 Ruby 混合函数。它们有点像 Java/C # 接口。
懒惰: Haskell 是懒惰的,F # 不是。懒惰使一些很好的技巧成为可能,并使一些看起来很慢的事情实际上执行得很快。但是我发现很难猜测我的代码运行的速度有多快。这两种语言都允许您使用另一种模型,您只需在代码中明确说明它。
细微差别:
一个主要的不同,这可能是纯度的结果,但我很少看到提到,是普遍使用单子。正如人们经常指出的那样,单子可以用大多数语言构建,但是当它们在整个库中被广泛使用时,生活就会发生巨大的变化,而且您可以自己使用它们。
Monads 提供了一些在其他语言中更为有限的东西: 流控制的抽象。它们是做各种事情的非常有用和优雅的方式,哈斯克尔的一年完全改变了我的编程方式,就像很多年前从命令式编程转向面向对象编程改变了它一样,或者,很久以后,使用高阶函数改变了它。
不幸的是,在这样一个空间里,没有办法提供足够的理解,让您看到区别在哪里。事实上,再多的写作也无济于事; 你只需要花足够的时间学习和编写代码来获得真正的理解。
同样,当您与。NET 平台/库,因为这些库显然是从面向对象的角度设计的。
所以你可能会这样考虑你的决定: 你是想尝试这些语言中的一种,以获得快速、相对较小的改进,还是愿意投入更多的时间,为了更大的长期目标而获得较少的直接收益。(或者,至少,如果你没有得到更大的东西,很容易就能迅速切换到另一个?)如果是前者,F # 是你的选择,如果是后者,Haskell。
还有一些不相关的问题:
Haskell 的语法稍微好一点,这并不奇怪,因为 Haskell 的设计者非常了解 ML。然而,F # 的“ light”语法在改进 ML 语法方面还有很长的路要走,所以不存在巨大的差距。
就平台而言,F # 当然是。我不知道这在 Mono 上效果如何。GHC 用自己的运行时编译成机器代码,在 Windows 和 Unix 下运行良好。NET 也是如此,比如说,C + + 就是这样做的。在某些情况下,这可能是一个优势,特别是在速度和低级机器访问方面。(例如,我在哈斯克尔/GHc 中编写一个 DDE 服务器没有任何问题,我不认为你可以在任何。NET 语言,无论如何,微软当然不希望你这样做。)