不当列表有什么作用?

7

这是我之前提出问题的后续:为什么需要nil?显然,大部分情况下都使用适当的列表。但是不适当的列表有什么用途呢?


“你的看法是什么?”这句话在你的问题中是一个危险的句子。正如你所知,Stack Overflow上没有容纳意见的地方,只有事实。寻求意见只会导致你的问题被关闭。目前,它已经有4个关闭投票;再有一个关闭投票将导致你的问题被关闭。 - C. K. Young
为了保存这个问题,我将完全重写这个问题。希望您没关系。 - C. K. Young
谢谢提醒和编辑,Chris。我没有意识到这一点。好吧,但它还是被关闭了? - day
4个回答

8

没有任何好的理由。不正确的列表唯一真正有用的地方是作为关联列表语法的一部分——即使在那里,定制的键值对语法也更好。你能想到的任何不正确列表的使用都可以用记录类型更好地实现——毕竟,记录类型包含列表:您可以根据记录定义Lisp列表,但不能反过来(因为列表不允许您定义数据结构,其类型与语言中所有其他类型不相交)。

滥用成对和列表来表示所有类型的数据是我所谓的Lisp程序员病,这是一个真正遗憾的事情,因为有这么多Lisp的拥护者提倡它。我已经不得不清理那些东西太多次了。


2
sacundim,谢谢你的解释。我对列表和记录一直感到困惑已经有一段时间了。我想多了解一些相关知识。但是通过谷歌搜索并没有返回任何有用的结果。既然你说你已经多次整理过这方面的内容,如果有的话,我很想看看它在哪里。谢谢。 - day

6
很好的问题!(好吧,我喜欢克里斯的改写方式......)根据我的经验,不恰当列表的最常见用法是作为轻量级的两个元素结构。推理如下:“哎呀,我需要一个两个元素的结构。喔,等等,为什么不使用“cons”?它内置在其中,并且它的语法引用支持得非常好。管他呢,我就这样做了。”特别是内置操作,例如“assoc”,通常以假定其给出不恰当的两个元素列表的方式实现。

4
不合适列表的存在是基本构建块cons、car和cdr存在的自然结果。Lisp的核心在于这三个构建块形成了各种更复杂数据类型的基础。将不合适列表挑出来禁止使用似乎需要强加任意限制。

2
不是这样的。这实际上是因为Lisp是动态类型(或从λ演算的角度来看,是无类型)的产物。Lisp的静态类型类比没有点列表,因为它们的cons对应物的类型限制了第二个参数必须是一个列表。例如,在Haskell中,我们有(:) :: a -> [a] -> [a]:运算符接受一个a和一个a列表,并返回一个a列表)。 - Luis Casillas
2
嘿,我不同意你们两个的观点 :). 构建一种动态类型语言,在其中只有在第二个元素是一个适当的列表时才能使用cons是很容易的。例如,请参见Racket中的教学语言级别。这有点像与+运算符相关的检查,例如。 +不能用于字符串,并且在应用时进行了检查。 - John Clements

1

“不当列表”是一个模糊的术语,指除了使用cons构建的列表之外的任何数据类型。

正如John所说,一个例子是以与ML中元组相同的方式使用cons对。

另一个例子是作为列表的变体。例如,可以将流定义如下:

;; A Stream-of-X is one of
;;   - null, ie '()
;;   - (cons X Stream-of-X)
;;   - a procedure taking no arguments and returning a Stream-of-X result

;; nats-from : nat -> Stream-of-nat
(define (nats-from n)
  (cons n (lambda () (nats-from (+ n 1)))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接