Functional programming 函数式编程:为什么将配对作为基本构造单元?

Functional programming 函数式编程:为什么将配对作为基本构造单元?,functional-programming,lisp,common-lisp,cons,Functional Programming,Lisp,Common Lisp,Cons,Basic cons cell将两个任意对象粘在一起,是允许构建链表和任意数据对象的基本单元。问题:是否有理由坚持这种简单的语言设计说明(例如,在所有lisp系列中)? 为什么不为此使用固定长度数组(或某些嵌套堆栈)?我无法预见这会有什么问题,但更“紧凑”的内存、更少的指针分辨率和更少的“死重”单元格在定义数据层次结构方面有明显的优势。您将问题命名为“函数式编程:为什么将对作为基本构造单元?”,但是,这个标题并没有正确地反映这样一个事实,即许多重要且众所周知的函数式语言(例如Haskell、F#

Basic cons cell将两个任意对象粘在一起,是允许构建链表和任意数据对象的基本单元。问题:是否有理由坚持这种简单的语言设计说明(例如,在所有lisp系列中)?

为什么不为此使用固定长度数组(或某些嵌套堆栈)?我无法预见这会有什么问题,但更“紧凑”的内存、更少的指针分辨率和更少的“死重”单元格在定义数据层次结构方面有明显的优势。

您将问题命名为“函数式编程:为什么将对作为基本构造单元?”,但是,这个标题并没有正确地反映这样一个事实,即许多重要且众所周知的函数式语言(例如Haskell、F#、Scala、SML、Clojure等)要么具有代数数据类型,要么具有不同的数据结构集合,在这些函数式语言中,如果可用的话,这一对只是不同类型的构造函数之一。对于支持函数编程的其他多范例语言,情况类似,例如C++、java、Objto-C、SWIFT等。 在所有这些情况下,该对(如果存在的话)作为数组、记录、列表或任何其他类型的数据构造函数都是“基本”的

剩下的是Lisp语言家族,尤其是Common Lisp和Scheme,它们除了拥有丰富的数据结构集(如Rainer Joswig的评论中引用的数据结构集)外,还将这对语言用于一项重要任务:作为表示程序的基本数据构造函数


Lisp代码是一个s表达式(即列表和原子列表)这一事实具有根本性的影响,最显著的是宏系统的兴起,它允许程序员轻松地创建新语法,甚至新的领域特定语言。

您的问题的标题是“函数式编程:为什么要将pair作为一个基本构造单元?”,但这个标题并没有正确地反映许多重要的和众所周知的函数式语言(例如Haskell、F#、Scala、SML、Clojure等)的事实有代数数据类型或不同的数据结构集合,如果对的话,这对是不同类型的构造函数之一。对于其他多范例语言来说,情况类似于支持函数编程的语言,如C++、java、Objto-C、Swift等。 在所有这些情况下,该对(如果存在的话)作为数组、记录、列表或任何其他类型的数据构造函数都是“基本”的

剩下的是Lisp语言家族,尤其是Common Lisp和Scheme,它们除了拥有丰富的数据结构集(如Rainer Joswig的评论中引用的数据结构集)外,还将这对语言用于一项重要任务:作为表示程序的基本数据构造函数

Lisp代码是一个s表达式(即列表和原子列表)具有根本性的后果,最显著的是宏系统的兴起,它允许程序员轻松创建新语法,甚至新的领域特定语言。

关于函数式编程中的其他结构,这一点非常突出。函数式编程是指将编程与逻辑和数学相结合,其中表达式denote值,并且没有副作用(当然,在实践中,我们需要I/O等的副作用)。函数式编程不需要将单链表作为基本构造

不过,列表是使Lisps变得很有说服力的因素之一。 成对在Lisp语言家族中如此常见的原因之一可能是,在Lisp的灵感来源lambda演算中,有序成对非常容易实现。(我说的是“灵感来源”而不是“基于”)因为在语法和使用lambda表示匿名函数之后,有很多不同之处,最好不要假设其中一个函数适用于另一个。)有关如何使用词汇闭包来实现cons、car和cdr的快速课程,请参见的答案。

关于函数式编程中的其他结构非常重要。函数式编程是关于将编程与逻辑和数学对齐,其中表达式表示值,没有副作用。(当然,在实践中,我们需要I/O等的副作用)函数式编程不需要单链表作为基本构造

不过,列表是使Lisps变得很有说服力的因素之一。
成对在Lisp语言家族中如此常见的原因之一可能是,在Lisp的灵感来源lambda演算中,有序成对非常容易实现。(我说的是“灵感来源”而不是“基于”)因为在语法和使用lambda表示匿名函数之后,有很多不同之处,最好不要假设其中一个函数适用于另一个。)有关如何使用词汇闭包来实现cons、car和cdr的快速课程,请参见的答案。

大多数LISP都有许多不是由cons单元格构成的数据结构:数字、符号、字符串、向量、多维数组、结构/记录、类/实例、哈希表等等。我认为set cdr!不容易实现具有嵌套堆栈或固定数组的nt。您还可以构建比链表更复杂的结构(二叉树、随机访问列表、队列和DEQUE),并且在C中实现这些单元格非常简单。用这种结构(嵌套列表)表示代码本身内部也使宏系统的实现变得更容易。你可以在幕后做一些奇怪的事情,但仍然像clojure那样口齿不清,但这样做的主要原因是Java虚拟机的局限性。更重要的是,访问速度更快,O(1)大多数Lisp都有许多不是由cons单元格组成的数据结构:数字、符号、字符串、向量、多维数组、结构/记录、类/实例、哈希表