我已经在Internet上搜索了F#和Haskell之间的比较,但是还没有找到真正确定的东西。主要区别是什么?为什么我要选择一个?
Answers:
Haskell是一种“纯”功能语言,在F#中,它同时具有命令性/ OO语言和功能性语言的方面。Haskell也有惰性评估,这在功能语言中很少见。
这些是什么意思?纯函数式语言表示没有副作用(或在调用函数时共享状态发生变化),这意味着可以保证,如果调用f(x),则除了从函数返回值外,不会发生任何其他事情,例如控制台输出,数据库输出,对全局或静态变量的更改..尽管Haskell可以具有非纯函数(通过monad),但必须通过声明“明确地”隐含它。
纯函数语言和“无副作用”编程最近很流行,因为它很适合多核并发,因为没有共享状态而不是无数的锁和信号量更容易出错。
惰性求值是在绝对必要之前才对函数求值的地方。意味着不需要时可以避免许多操作。在这样的基本C#if子句中考虑一下:
if(IsSomethingTrue() && AnotherThingTrue())
{
do something;
}
如果IsSomethingTrue()
为false,则AnotherThingTrue()
永远不会评估方法。
虽然Haskell是一种了不起的语言,但F#(暂时)的主要好处是它位于CLR之上。这使其很容易进行多语言编程。有一天,您可以在ASP.net MVC中编写Web UI,在C#中编写业务逻辑,在F#中编写核心算法,并在Ironruby中编写单元测试...。
收听与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 mixins。它们有点像Java / C#接口。
懒惰:Haskell很懒,F#不是。懒惰可以带来一些不错的技巧,并使看起来缓慢的某些事情实际上可以快速执行。但是我发现很难猜测我的代码将运行多快。两种语言都允许您使用其他模型,只需在代码中对其进行明确说明即可。
细微差异:
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相比,GHC的运行方式相同,例如C ++。在某些情况下,尤其是在速度和较低级别的机器访问方面,这可能是一个优势。(例如,我在Haskell / GHC中编写DDE服务器没有问题;我认为您无法用任何.NET语言来完成此操作,并且,不管怎么说,MS当然不希望您这样做。)
好吧,我要说的一个主要优点是F#可以根据.NET平台进行编译,从而可以轻松地在Windows上进行部署。我看过一些示例,这些示例解释了如何结合使用F#和ASP.NET来构建Web应用程序;-)
另一方面,Haskell的存在时间更长了,所以我认为真正使用该语言的专家群体要大得多。
对于F#,到目前为止,我只看到一种实际的实现,这是概念OS的奇点证明。我已经看到了Haskell的更多实际实现。