Haskell AND Lisp与Haskell OR Lisp的比较[关闭]


40

我目前使用C,C ++和Python进行编码。我想学习一种函数式编程语言,现在我倾向于Haskell。我不想在这里发动“ Haskell vs Lisp”战争。我想知道的是:如果我主要是通过学习函数式编程来学习Haskell的,那么以后学习Lisp可以带来什么好处(如果有)?


1
还有F#和Clojure。
cnd 2012年

Answers:


58

我建议先学习Haskell,然后再学习Common Lisp。我在Haskell上的经验是,一开始静态类型似乎是一个令人烦恼的烦恼,但是一旦我习惯了静态类型,我注意到我的大多数类型错误都有隐藏在它们后面的逻辑错误。至此,下一个里程碑就是学习思考类型并定义自己的类型,作为表达解决方案的一种方式,您将为Common Lisp做好准备。

使用Common Lisp,您可以从Haskell添加monad,currying以及所有您喜欢的东西,但是您还会获得多重继承(如提到的Frank Shearar),具有多个分派的泛型函数和高级异常处理系统。

那么,为什么不先学习Common Lisp?来自程序和OOP的背景,我的经验是直到真正使用函数式编程才真正了解它。一旦可以进行功能编程,就可以添加Common Lisp提供的其余工具,并使用手头最适合的工具。


6
我认为您已将其钉牢-使Haskell和Smalltalk在学习中如此有用的原因在于它们的纯度。
Frank Shearar 2010年

4
我同意纯粹性使学习语言变得容易得多。我无法用LISP理解函数式语言本身,因为一切都可以用该语言实现,而且我有太多必要的面向对象背景。但是在Haskell中,没有这样的概念会干扰学习。
Eonil 2011年

1
很好笑,我经历了相反的经历。我通过我的第一门语言Scheme掌握了函数式编程的要点。我偶尔会入侵Haskell,并且不可避免地发现,每当我离开Haskell一段时间,我就必须重新学习90%以上的知识。话虽这么说,Haskell是一门非常丰富的语言,可以(非常强迫地)教给您很多类型。类型类型类型类型!按照类型!
Josh Infiesto 2012年

31

和请。

就我所知,Haskell至少会教给您FP的最纯正知识,就像Smalltalk教给您OO的最纯正知识一样。(我提到这并不是说OO和FP不能结婚,而是因为这两种语言都是“宝石”语言,这是极端的核心思想。)

Lisp实际上是一种语言家族,因此我将讨论Common Lisp,因为这是我使用的特定家族。

Lisp仍然可以教你很多知识:

  • 它是多范式,因此dsimcha指出,它将向您展示如何将FP与其他范式集成。
  • Lisp会例如通过其宏来教您“代码就是数据,数据就是代码”。
  • CLOS是一个非常有趣的OO品牌,具有有效的多重继承和通用功能。

11

稍后学习Lisp将使您能够自定义Emacs,它可以说是最先进的文本编辑器。您无法在Haskell中做到这一点。


14
[锐化他括号]
Inaimathi

6
也许有人可以为其编写文本编辑器。我听说Emacs操作系统不附带一个。(我
开玩笑

14
实际上,有一个名为Yi的Emacs克隆,它使用Haskell的方式与Emacs使用Lisp的方式完全相同。实际上,与(GNU)Emacs相比,Yi更加纯净,因为它的内核也是用Haskell编写的,而Emacs内核通常倾向于不使用Lisp编写。例如,GNU Emacs的内核是用C编写的,而JEmacs的内核是用Java编写的。
约尔格W¯¯米塔格

2
@Jörg,如果它是部分重新实现而不是GNU Emacs或XEmacs的完整克隆,则不是同一回事。类似于将Word与写字板或记事本进行比较。

1
@ThorbjørnRavn Andersen:是的,但不是那么糟糕。:)
greyfade

11

Haskell和Lisp是两个完全不同的野兽。

Haskell是一种“象牙塔中的纯函数式编程”

Lisp有点像“代码就是数据/数据就是代码/构建自己的语言结构”。您可以用您可以想象的任何方式来操作代码。

他们有很大的不同。两者都共享“函数式编程”方面,但是与它们之间的差异相比,这确实是一个很小的共同点。只需尝试一下,您就会发现它们有何不同!


+1:好点。我知道一些Haskell和Lisp。即使我在这两个方面都不是专家,但我认为您是对的,因为它们有很大的不同。在Haskell中,您没有使用数据作为代码的想法。在Lisp中,您没有(AFAIK)模式匹配。差异列表(!)可能更长。
乔治

7

通过学习Lisp,我看到的主要好处是学习如何将FP集成到面向现实世界的多范式语言中,而不是仅在强调纯正性的学术语言中学习它。


5
我猜你确实想打一场“哈斯克尔vs Lisp”战争!
唐·罗比

3
Haskell 一门强调纯洁的学术语言……许多人在现实世界中使用它。Smalltalk也在那个营地。
Frank Shearar 2010年

在现实世界中有很多人在使用Haskell?
乔恩·哈罗普

1
@乔恩·哈罗普(Jon Harrop):好吧,我确实在现实世界中使用过Haskell(它在某些应用程序中确实可以正常工作),也许我是少数几个(?)
乔治

5

我也来自C / C ++ / Python背景,并且在过去几年中多次尝试了FP。最初,我看着Haskell,无法做出它的头或尾,然后尝试了Ocaml,但是对此一无所知。最终,我开始听到有关Scala的好消息,尝试了一下,发现它非常适合我(过去我也做过Java),以至于在Scala中涉足了一年(然后分发了161个) Project Euler问题),Haskell似乎更有意义。实际上,我只是订购了两本有关Haskell的书,并想再作一遍,尽管这在很大程度上是由于Scalaz的存在所致。

因此,我发现使用多范式语言(即Scala,但Lisp也可能适合)成为FP的好方法。但是,如果您乐于进入Haskell(我不是),那就去吧。


有趣的是,使用Scala比使用OCaml更进一步。怎么会?
乔恩·哈罗普

@Jon:很好的问题;很难说。也许我当时还没有准备好“进入”功能。也许我只是偶然发现了一个Scala教程,它的级别合适。也许Scala的C / C ++ / Java世系使它变得不那么陌生了。考虑到这些天的任何合理选择都应该放在F#而非Scala上,我可能会在某个时候重新访问OCaml域,尽管由于我涉足这些东西只是为了获得进入C ++不同的“编程思维方式”的纯粹乐趣。日间工作,我有错误的倾向,接下来要重试Haskell。
2010年

平稳移动:)
Eonil 2011年

2

我最初来自C / C ++ / Ruby背景,并在可能的情况下在Ruby中使用FP概念。状态只是伤害了我的大脑。我的一个好友有一天打电话给我,他要我在Haskell上写点东西(我的第一个-希望不是最后一个-Haskell的工作!)。我很快学会了该语言,并提出了一些可行的建议。它虽然不漂亮,但效果很好。

我从Haskell休假了一个月,因为我没有什么可使用的。但是当我决定需要编写自己的博客软件时,我使用了Haskell(https://symer.io)。Haskell真的很酷,因为您可以将问题分解成多个部分,并根据输入以不同的方式实现这些部分。Haskell还可以通过智能装箱值来很好地处理故障。使用这些工具的工具太多了,您根本就忘了它们的存在。

我对Lisp(Scheme)的体验完全是负面的。该语言不仅缺少这些智能,简单的工具,而且感觉与Ruby或JavaScript一样松散。这是一次可怕的经历,除了Ruby或Python,它没有提供其他任何新功能。

在内存管理之外,C ++不能满足Haskell的需求。Haskell速度一样快(如果不是更快的话),简洁得多,而且安全得多。但是Haskell的安全永远不会受到阻碍。

TL; TR Haskell呼吸新鲜空气,而Lisp是功能更强大的Ruby。

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.