【问题标题】:Is Haskell a Lisp?Haskell 是 Lisp 吗?
【发布时间】:2011-06-09 10:59:20
【问题描述】:

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

【问题讨论】:

  • 我不同意,但作者给出的论点是什么?
  • 无!他们给出了一般性的介绍,并说“作为一种函数式语言,Haskell 与 ML、Occam 和 Clean 一起属于 Lisp 家族”。
  • 那是假的。 Lisp 可能是第一个函数式语言,但这并不能使所有函数式语言都成为 lisp,就像 Java 不是 Smalltalk 和 Python 不是 C 一样。此外,在您的 Lisp 特性列表中,Haskell 缺乏,Lisp 几乎没有Haskell 超越初学者级别的特性(初学者:Monads、代数数据类型和模式匹配)。
  • 列表不是 Lisp 中唯一的复合数据结构。它们恰好被用于语法树。
  • 这不正是一个“我很好奇其他人是否有这样的感觉”类型的“问题”吗?根据常见问题解答,这些都是要“避免”的。

标签: haskell lisp language-comparisons


【解决方案1】:

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 机器 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 是一种被视为纯函数式编程语言的语言。

【讨论】:

  • 是的,超越语法本身,JavaScript 可能更像是 Lisp 而不是 Haskell。 (最初被设想为一个 Scheme 实现......)
  • @Kevin Cantu:这绝非偶然。 Brendan Eich 在他的网站上提到 Netscape 雇佣他时承诺他会在浏览器中实现 Scheme。 ;-)
  • 顺便说一句,我错过了作为 LISP 独特属性之一的同音性(尽管人们可以通过提及 s 表达式来推断它)
  • @hvr:那是因为“同源性”是一个令人困惑的术语,在 Lisp 世界中使用得不多。在那里我们讨论了使用符号表达式的计算(参见 McCarthy 关于 Lisp 的原始论文)。有时我们会谈论“代码即数据”。
【解决方案2】:

我认为将 Haskell 视为 LISP 家族的成员有点牵强,但我怀疑推理是这样的......

在对编程语言进行分类时,将它们分为两组是有意义的:源自 FORTRAN 的和非 FORTRAN 的。在 1958 年,“非 FORTRAN 组”几乎意味着 LISP(至少,在今天尚未灭绝的语言中)。因此,有一段时间,编程语言家族树有两个主要分支:FORTRAN 后代和 LISP 后代。如果只有这两个选择,那么我会将 Haskell 放入 LISP 分支。

但是,许多评论员认为 ML、Prolog 和 APL 等语言的出现是“出乎意料的”——引入了足够不同的范式来为其自身提供血统。 Haskell 显然与 ML 类似。

作为此类分类的示例,请参阅以下编程语言家族树:

O'Reilly's Programming Language Poster

Computer Languages Timeline at levenez.com

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

【讨论】:

【解决方案3】:

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

【讨论】:

  • 类型系统比语法更重要!
【解决方案4】:

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

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

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

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

【讨论】:

  • 非常通俗地说,Lisps 基本上等同于无类型的 lambda 演算。得益于 Hindley-Milner 类型系统,Haskell 基本上是类型化的 lambda 演算。我认为这种区别足以断言 Haskell 不是 Lisp。
【解决方案5】:

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

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

这可能不是完整的列表,也可能没有其他成员,但无论如何,John McCarthy's original specification 非常小。

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

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

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

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

所以我会说不,Haskell 不是 lisp。

【讨论】:

  • “代码即数据范式”是什么意思?模板 Haskell 可以操作语法树;还需要什么?
【解决方案6】:

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

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

【讨论】:

  • Lisp 源代码可以是 Lisp 中的数据结构,因为 Lisp 是动态类型的,并且可以轻松处理包含符号、字符串、数字、向量、其他列表等混合的列表。
【解决方案7】:

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

【讨论】:

    【解决方案8】:

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

    尽管如此,Haskell 和 Lisp 之间的共同点比 C 家族或 Prolog 家族的共同点要多得多。

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

    【讨论】:

    • 计划?不不不。计划是花哨的现代东西。当我们谈论函数式编程的基础时,我们谈论的是早期的原始 Lisp,即使是今天的“Lispers”也会鄙视。
    • 早期的原始 lisp 并没有解决 funargs,尽管大致同时期的工作已经解决了。没有适当的词法范围和一流的功能 = 没有远程功能。
    • ML 沿袭不同的,因为它比 Scheme 更早。 Miranda 血统(SASL - KRC - Miranda - Haskell)也是如此。我认为关于 Scheme 的发表工作可以追溯到 1976 年左右,SASL 可以追溯到 1972 年。 LCF 是 ML 的原始主机可以追溯到 1972 年,但我不知道 ML 在其中的状态。 Backus 的 FP 甚至可能先于 Scheme。
    • @delnan:很有可能Scheme比你年长,除非你年满36岁。
    • @sclv:Scheme 共享 ML 语义,OCaml、F#、SML 甚至 LISP-1 等许多其他语义也是如此。
    【解决方案9】:

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

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

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

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

    【讨论】:

    • Hoyte 对 lisp 的看法通常被认为有点……特殊。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多