Haskell和F#之间的主要区别是什么?[关闭]


135

我已经在Internet上搜索了F#Haskell之间的比较,但是还没有找到真正确定的东西。主要区别是什么?为什么我要选择一个?


1
关于F#的好处是,由于它的混合范例,它为OO程序员提供了一个更好的起点。他可以逐渐加快使用功能性思维的速度,而仍然像在C#中那样继续使用熟悉的OO库。Haskell一次将整个功能性辣酱玉米饼馅强加于您。
Mario

重要的是要注意,F#不是一种功能编程语言。但是,它从FP中采用了很多,因此有可能发现许多相似之处,但是尽管如此,我主要还是要说它们是完全不同的语言。
2015年

Answers:


128

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的信息


8
F#的另一个潜在的主要好处(取决于情况)是,它并不懒惰,这意味着对于每个人来说,进行时空行为推理的学习曲线将更加简单。
cjs

5
直接链接到se-radio第108集(Simon Peyton Jones):se-radio.net/podcast/2008-08/…–
Herrmann

9
值得指出的另一个功能是,一种语言可以执行纯编程,而编译器在进行许多优化时具有更大的自由度。诸如F#之类的语言鼓励纯净,但仍允许未经检查的不纯运算丢弃在任何代码块中,从而在某些潜在的优化上失传,因为编译器被迫假定每个调用都包含必要的副作用。

12
@JonHarrop:这是关于算法的声明,与编译器优化的适用性无关。强制纯净语言通常允许您在确实需要时编写明确不纯的代码(如果没有其他要求,则使用FFI调用C)。当编译器不保留副作用(未知)的顺序时,它可以更自由地应用代码转换。在“鼓励的纯净”语言中,您编写的代码几乎都是相似的,因此相同的优化将适用,只有它们可以使副作用无效(这种副作用尚不存在,但编译器无法假定)。
2012年

3
@JonHarrop我什么时候声称它们都是算法?无论如何,我们都在比较Haskell和F#,而不是Haskell和C。F#是一种“鼓励的纯净”语言,因此您经常编写纯代码。我所声称的是,编译器通常可以在“强制纯度”设置中更好地优化完全相同的代码,因为F#编译器必须假定调用具有副作用。您正在谈论的是重写代码以使用另一种算法(一种算法取决于副作用)。我正在考虑F#与Haskell中纯代码的“可优化性”。
2012年

53

巨大差异:

  • 平台
  • 面向对象
  • 懒惰

相似性比差异更重要。基本上,如果您已经在.NET上,则应使用F#;否则,应使用Haskell。另外,OO和懒惰意味着F#更接近您(可能)已经知道的内容,因此它可能更容易学习。

平台:Haskell有自己的运行时,F#使用.NET。我不知道性能差异是什么,尽管我怀疑优化之前的平均代码大致相同。如果您需要.NET库,则F#具有优势。

面向对象:F#具有OO,并且非常小心以确保.NET类易于使用,即使您的代码不是OO。Haskell具有类型类,可让您以一种怪异的方式执行类似于OO的操作。它们就像与Common Lisp泛型函数交叉的Ruby mixins。它们有点像Java / C#接口。

懒惰:Haskell很懒,F#不是。懒惰可以带来一些不错的技巧,并使看起来缓慢的某些事情实际上可以快速执行。但是我发现很难猜测我的代码将运行多快。两种语言都允许您使用其他模型,只需在代码中对其进行明确说明即可。

细微差异:

  • 语法:我认为Haskell的语法稍好。它更加简洁和常规,我喜欢在单独的行中声明类型。YMMV。
  • 工具:如果您喜欢F#,它具有出色的Visual Studio集成。Haskell还具有较旧的Visual Studio插件,但我认为它从未脱离beta版。Haskell有一个简单的emacs模式,您可能可以使用OCaml的tuareg模式来编辑F#。
  • 副作用:这两种语言都让它非常明显,当被变异的变量。但是Haskell的编译器还会在您使用副作用时强制您标记副作用。实际的区别在于,当您还使用带有副作用的库时,必须更加了解。

1
查看性能。不知道它的
合法性


33

主要的区别可能是纯度的结果,但我很少看到提及,这是单子的普遍使用。正如经常指出的那样,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当然不希望您这样做。)


2

好吧,我要说的一个主要优点是F#可以根据.NET平台进行编译,从而可以轻松地在Windows上进行部署。我看过一些示例,这些示例解释了如何结合使用F#和ASP.NET来构建Web应用程序;-)

另一方面,Haskell的存在时间更长了,所以我认为真正使用该语言的专家群体要大得多。

对于F#,到目前为止,我只看到一种实际的实现,这是概念OS的奇点证明。我已经看到了Haskell的更多实际实现。


4
F#已经有一些主要的成功案例(Halo 3,AdCenter,F#for Visualization)使Haskell与成功案例(Darcs)最接近的东西相形见war。
JD

值得指出的是,这当然有不利之处。(CLR限制)
MasterMastic 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.