Answers:
我建议先学习Haskell,然后再学习Common Lisp。我在Haskell上的经验是,一开始静态类型似乎是一个令人烦恼的烦恼,但是一旦我习惯了静态类型,我注意到我的大多数类型错误都有隐藏在它们后面的逻辑错误。至此,下一个里程碑就是学习思考类型并定义自己的类型,作为表达解决方案的一种方式,您将为Common Lisp做好准备。
使用Common Lisp,您可以从Haskell添加monad,currying以及所有您喜欢的东西,但是您还会获得多重继承(如提到的Frank Shearar),具有多个分派的泛型函数和高级异常处理系统。
那么,为什么不先学习Common Lisp?来自程序和OOP的背景,我的经验是直到真正使用函数式编程才真正了解它。一旦可以进行功能编程,就可以添加Common Lisp提供的其余工具,并使用手头最适合的工具。
和请。
就我所知,Haskell至少会教给您FP的最纯正知识,就像Smalltalk教给您OO的最纯正知识一样。(我提到这并不是说OO和FP不能结婚,而是因为这两种语言都是“宝石”语言,这是极端的核心思想。)
Lisp实际上是一种语言家族,因此我将讨论Common Lisp,因为这是我使用的特定家族。
Lisp仍然可以教你很多知识:
稍后学习Lisp将使您能够自定义Emacs,它可以说是最先进的文本编辑器。您无法在Haskell中做到这一点。
Haskell和Lisp是两个完全不同的野兽。
Haskell是一种“象牙塔中的纯函数式编程”
Lisp有点像“代码就是数据/数据就是代码/构建自己的语言结构”。您可以用您可以想象的任何方式来操作代码。
他们有很大的不同。两者都共享“函数式编程”方面,但是与它们之间的差异相比,这确实是一个很小的共同点。只需尝试一下,您就会发现它们有何不同!
通过学习Lisp,我看到的主要好处是学习如何将FP集成到面向现实世界的多范式语言中,而不是仅在强调纯正性的学术语言中学习它。
我也来自C / C ++ / Python背景,并且在过去几年中多次尝试了FP。最初,我看着Haskell,无法做出它的头或尾,然后尝试了Ocaml,但是对此一无所知。最终,我开始听到有关Scala的好消息,尝试了一下,发现它非常适合我(过去我也做过Java),以至于在Scala中涉足了一年(然后分发了161个) Project Euler问题),Haskell似乎更有意义。实际上,我只是订购了两本有关Haskell的书,并想再作一遍,尽管这在很大程度上是由于Scalaz的存在所致。
因此,我发现使用多范式语言(即Scala,但Lisp也可能适合)成为FP的好方法。但是,如果您乐于进入Haskell(我不是),那就去吧。
我最初来自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。