函数式编程:为什么配对是一个基本的构造单元



Basic cons cell将两个任意的东西粘在一起,是允许构建链表和任意数据对象的基本单元。问题:有没有理由坚持这种简单的语言设计描述(例如,在所有的lisp家族中)
为什么不使用固定长度的数组(或一些嵌套堆栈)?我无法预见这会有任何问题,但有明显的优势,内存更"紧凑",指针分辨率更低,定义数据层次结构的"自重"单元格更少。

您已经将您的问题命名为"函数式编程:为什么将配对作为一个基本的构造单元?",但这个标题并没有正确地反映出许多重要且众所周知的函数式语言(如Haskell、F#、Scala、SML、Clojure等)要么具有代数数据类型,要么具有不同的数据结构集合,其中该对只是不同类型的构造函数之一(如果可用的话)。其他多基语言的情况类似,它们支持函数式编程,如C++、Java、Objective-C、Swift等。

在所有这些情况下,如果存在,则该对作为数组、记录、列表或任何其他类型的数据构造函数是完全"基本"的。

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

Lisp代码是一个s-表达式(即列表和原子的列表),这一事实产生了根本性的后果,其中最值得注意的是宏系统的兴起,它允许程序员轻松地创建新的语法,甚至新的特定领域语言。

Renzo关于函数编程中其他结构的回答很到位。函数编程是关于将编程与逻辑和数学相结合,其中表达式表示值,没有副作用。(当然,在实践中,我们需要I/O等的副作用。)函数式编程不需要将单链表作为基本结构。

列表是使Lisps变得含糊不清的原因之一。对在Lisp语言家族中如此常见的原因之一可能是,有序对在Lisps所受的lambda演算中非常容易实现。)请参阅SICP中cons/car/cdr定义中使用lambda的答案,了解如何只使用词法闭包实现cons、car和cdr。

相关内容

  • 没有找到相关文章

最新更新