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