这是我之前提出问题的后续:为什么需要nil?显然,大部分情况下都使用适当的列表。但是不适当的列表有什么用途呢?
这是我之前提出问题的后续:为什么需要nil?显然,大部分情况下都使用适当的列表。但是不适当的列表有什么用途呢?
没有任何好的理由。不正确的列表唯一真正有用的地方是作为关联列表语法的一部分——即使在那里,定制的键值对语法也更好。你能想到的任何不正确列表的使用都可以用记录类型更好地实现——毕竟,记录类型包含列表:您可以根据记录定义Lisp列表,但不能反过来(因为列表不允许您定义数据结构,其类型与语言中所有其他类型不相交)。
滥用成对和列表来表示所有类型的数据是我所谓的Lisp程序员病,这是一个真正遗憾的事情,因为有这么多Lisp的拥护者提倡它。我已经不得不清理那些东西太多次了。
cons
对应物的类型限制了第二个参数必须是一个列表。例如,在Haskell中,我们有(:) :: a -> [a] -> [a]
(:
运算符接受一个a
和一个a
列表,并返回一个a
列表)。 - Luis Casillas“不当列表”是一个模糊的术语,指除了使用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)))))