33

我一直在阅读 Doets 和 Eijck 的 The Haskell Road to Logic, Maths and Programming 2004。这似乎是一本受人尊敬的书,但是当它声称 Haskell 是 Lisp 家族的成员时,我感到很震惊。这是准确的吗?我会用 s 表达式、不纯函数和列表来描述 Lisps,作为唯一的复合数据结构。Haskell 没有这些。这种说法有什么理由?

4

9 回答 9

43

Lisp 是一个非常模糊的概念。我看到两个或多或少有用的解释:

  1. Lisp 作为一个拥有一些共同思想的语言家族。在广泛的解释中,非常不同的语言属于这个家族:Common Lisp、Scheme、Logo、Dylan、Emacs Lisp、Clojure、RLisp、3Lisp 等等。

  2. Lisp 作为以某种方式实现核心语言(CAR、CDR、CONS、LAMBDA、PROG、SET、SETQ、QUOTE、DEFUN、IF、COND、DO、...)的语言谱系:Lisp 1.5、MacLisp、Lisp Machine Lisp、Emacs Lisp、Common Lisp、ISLisp。请注意,这些语言通常将“Lisp”作为其名称的一部分。

我们在 Lisp 方言中发现了一些典型的东西:严格求值、副作用、直接命令式编程、函数式编程结构、s 表达式、求值、宏。

Haskell 是一种非常不同的语言:非严格求值、不基于 s 表达式的语法、静态类型、纯函数式。

Haskell 不适合 1 或 2。所以,我会说 Haskell 不是 Lisp。

类似地,我们可以说函数式编程语言是:

  1. 一种支持函数式编程的语言:Lisp、APL、...、ML、SML、OCAML、F#、Miranda、Haskell、...

  2. 一种强制执行函数式编程的语言。在这里 Lisp 已经不适合了,因为命令式甚至面向对象的编程在 Lisp 中都不是第二类。

  3. 一种强制执行纯函数式编程的语言。这里我们以 Haskell 作为一个很好的例子。作为一种相对较新的 Lisp 方言,Clojure 也可能适合。

通常 Lisp 只支持,但不强制执行函数式编程。所以它是一种更广泛解释的函数式编程语言。

Haskell 是一种被视为纯函数式编程语言的语言。

于 2011-01-14T22:49:59.637 回答
19

I think that it is a stretch to consider Haskell as a member of the LISP family, but I suspect the reasoning goes something like this...

When classifying programming languages, it is meaningful to divide them into two groups: those descended from FORTRAN and those that are not. In 1958, the "not FORTRAN group" pretty much meant LISP (at least, among the languages that are not extinct today). So, for a time, the programming language family tree had two main branches: the FORTRAN descendants and the LISP descendants. If those are the only two choices, then I would put Haskell into the LISP branch.

However, many commentators consider languages like ML, Prolog and APL to have arisen "out of the blue" -- introducing sufficiently distinct paradigms to merit lineages unto themselves. Haskell is clearly kin to ML.

As examples of such classifications, see the following programming language family trees:

O'Reilly's Programming Language Poster

Computer Languages Timeline at levenez.com

HOPL: an interactive Roster of Programming Languages (Haskell Entry)

于 2011-01-15T06:59:36.763 回答
9

我不同意。它们都是函数式编程语言,并且受 Lisp 影响的 Haskell,但 Haskell 不是 Lisp 的衍生产品。看看括号的数量就知道了。

于 2011-01-14T22:23:51.357 回答
4

人们对口齿不清的定义各不相同。lisp 的原始规范根本没有提到宏,只定义了一小部分原始函数,如果我没记错的话,它们如下:

  • cons
  • car
  • cdr
  • cond
  • eq
  • atom
  • and
  • or
  • not
  • nil

这可能不是完整的列表,也可能没有其他成员,但无论如何,John McCarthy 的原始规范非常小。

如果您将 lisp 定义为定义所有这些功能的任何语言,那么大多数现代语言都是 lisp,包括 haskell。

一个更严格和现代的 lisp 定义如下:

  • 热切的评价
  • 动态类型
  • 不纯功能
  • 专注于列表作为主要数据结构

Haskell 不适合前 3 个,它的宏(模板 haskell)不遵循代码即数据范式,虽然列表非常重要,但它们不是主要的数据结构。

所以我会说不,Haskell 不是一个口齿不清的人。

于 2011-12-27T22:47:15.977 回答
4

我认为 Haskell一个 Lisp,因为它们都基于 λ 演算。Haskell 是 λ 的一个实现。

尽管大多数人会说 Haskell 属于 ML 家族。ML 也基于 λ,我所知道的所有函数式语言也是如此。

在底层,OCam(源自 ML)被编译为组合逻辑,一种等同于 λ 演算的形式,由 Haskell Curry 发明,Haskell 以他的名字命名。但是现在使用组合逻辑进行功能语言编译似乎不那么流行了,所以我不确定像 GHC 这样的现代编译器。

Lisp 的语法与 λ 演算几乎相同,这使得这个家族(Scheme、Clojure 等)非常特别。

于 2011-06-02T01:56:03.027 回答
2

Haskell 当然不是 lisp。每个人都有自己的理解到底什么是“口齿不清”。恕我直言 lisp 是一种语言,其中源代码是该语言的有效结构。Haskell 源代码在 Haskell 中不是一个有效的结构,因此它们必须有一个单独的语法(Haskell 模板)来操作自己的源代码。

但是 haskell 中至少有一个有趣的特性让我想起了 lisp。它的函数调用语法:func args1 agr2 arg3。Lisp 的语法完全相同:(func args1 agr2 arg3)。事实上,你也可以在 haskell 中包含外部括号。所有其他 algol 系列语言在函数名和参数之间引入括号和逗号。

于 2011-01-20T05:11:35.400 回答
1

我想说两者都是函数式语言,这使得它们属于同一个家族。但是,我不会将 Haskell 称为 Lisp 派生类(如 Scheme)。

于 2011-01-14T22:34:46.893 回答
1

可以说,所有函数式语言都是 Scheme 的后代,在某种程度上,Scheme 粗略地偶然实现了 lambda 演算(尽管有一些怪癖),并且函数式语言也实现了 lambda 演算,尽管它们不一定总是看起来像它。此外,可以说,ML 谱系是完全不同的,因为它可以追溯到 Landin 的 ISWIM,它很有影响力但从未实施过,与 Lisp 几乎没有关系,并且从一开始就知道它的理论基础。

然而,真正的事情是 Haskell 和 Lisp 彼此之间的共同点比 C 家族或 Prolog 家族的共同点要多得多。

我会争辩说人们应该回顾一下语法问题,但我忘记了 Lispers 将语法定义为成为 lisp 的关键部分。我认为这很愚蠢,因为可以说 Haskell 不是 Lisp,但Liskell是,尽管后者基本上是前者的处理器。

于 2011-01-14T22:37:31.397 回答
-2

Hoyte 比较了一些语言,并声称 Haskell 不是 Lisp,因为它的类型过于严格并且仅适用于学者,而 Common Lisp 更像是一种原型语言(没有严格性,动态类型)。

请参阅:Doug Hoyte 的 Let Over Lambda — Lisp 50 年(一本关于 Common Lisp 的高级书籍, http: //letoverlambda.com/

Haskell 和 Common Lisp(可能所有 Lisp)针对函数式编程(FP)范式进行了优化。Haskell 是纯的,而 Common Lisp 是不纯的。将术语 FP 也与“完全函数式编程”进行对比。

还可以看看这个比较编程语言范例的图表:http: //www.info.ucl.ac.be/~pvr/paradigms.html

于 2011-01-22T17:04:48.950 回答