Functional programming 列表作为通用数据类型表示的缺点是什么?

Functional programming 列表作为通用数据类型表示的缺点是什么?,functional-programming,lisp,scheme,s-expression,Functional Programming,Lisp,Scheme,S Expression,Lisp程序员倾向于使用列表来表示所有其他数据类型 然而,我听说列表并不是数据类型的一种很好的通用表示 与使用记录相比,以这种方式使用列表的缺点是什么?缺点是它不是通用的。有时这与性能有关:您需要固定时间的查找(数组、哈希表)。有时,这与组织有关:您希望命名数据位置(哈希表、记录……尽管您可以在列表中使用名称、值对)。这需要作者稍微努力,使代码能够自我记录(比记录更努力)。有时,您希望类型系统捕捉到由于将内容放在错误位置(记录、键入元组)而导致的错误 但是,大多数问题可以在以后使用Optimiz

Lisp程序员倾向于使用列表来表示所有其他数据类型

然而,我听说列表并不是数据类型的一种很好的通用表示


与使用记录相比,以这种方式使用列表的缺点是什么?

缺点是它不是通用的。有时这与性能有关:您需要固定时间的查找(数组、哈希表)。有时,这与组织有关:您希望命名数据位置(哈希表、记录……尽管您可以在列表中使用名称、值对)。这需要作者稍微努力,使代码能够自我记录(比记录更努力)。有时,您希望类型系统捕捉到由于将内容放在错误位置(记录、键入元组)而导致的错误


但是,大多数问题可以在以后使用Optimized解决。列表是一个多功能的小数据结构。

您提到“记录”。我认为您指的是固定元素结构/对象/复合数据。例如,在HtDP语法中:

;; a packet is (make-packet destination source text) where destination is a number, 
;; source is a number, and text is a string.
。。。你问的是把一个包表示成一个长度为3的列表的利弊, 而不是作为一段复合数据(或“记录”)


在适合使用复合数据的情况下——这些值具有特定的角色和名称,并且有固定数量的角色和名称——复合数据通常更可取;它们可以帮助您捕获程序中的错误,这是编程的必要条件。

您正在谈论Peter Seibel在实用公共Lisp第11章中所述的内容:

[开始]讨论Lisp的收藏 用列表。通常会导致读者误读 结论是列表是Lisp唯一的集合类型。发号施令 更糟糕的是,因为Lisp的列表是如此灵活的数据结构,所以它是 可以将它们用于数组和哈希表的许多功能 用于在其他语言中使用。但过分关注是错误的 清单;而它们是表示Lisp的关键数据结构 代码作为Lisp数据,在许多情况下,其他数据结构更为复杂 合适

一旦您熟悉了通用Lisp提供的所有数据类型, 您还将看到列表对于数据原型化非常有用 以后将被更高效的东西取代的结构 一旦弄清楚如何准确地使用数据

我看到的一些原因是:

  • 例如,一个大的哈希表比同等的列表具有更快的访问速度
  • 单一数据类型的向量更紧凑,访问速度也更快
  • 通过索引可以更高效、更容易地访问向量
  • 对象和结构允许您按名称而不是位置访问数据

它归结为为为手头的任务使用正确的数据类型。当它不明显时,你有两个选择:猜测并稍后修复它,或者现在就解决它;这两种方法有时都是正确的。

这个问题太笼统了。我是一名Lisp程序员,我不倾向于使用列表来表示其他数据类型。我没有听说过其他人这样做。你是怎么想到的?我在Lisp中使用哈希表、对象、字符串和向量。还有名单。我不知道你在说什么。我知道我在Python和Perl中使用了类似的混合数据类型。请回顾现代通用Lisp,而不是1964年左右的Lisp:-/“然而,大多数问题都可以用OptimizeLater解决。这个列表是一个多功能的小数据结构。”好吧,我在Lisp商店工作过,这个“OptimizeLater”经常被证明是“糟糕地编写糟糕的基于列表的版本,退出公司,然后可怜的sacundim在凌晨12点被叫去重写无法理解的基于列表的代码,因为这会使应用程序无法扩展。“可怜的萨康迪姆,真的。”我在写它之前就考虑过了。正如斯万特在他的评论中所说,如果你有任何经验,你通常不会这样写代码。然而,lisp教科书通常是这样开始的。希望plmday能够超越这些书中的前几章,在这几章中不可避免地会讨论其他数据结构。