【问题标题】:What are improper lists for?什么是不正确的列表?
【发布时间】:2012-01-30 19:56:29
【问题描述】:

这是我上一个问题的后续:Why do we need nil? 显然,大多数时间都使用正确的列表。但是不适当的列表的目的是什么?

【问题讨论】:

  • “你的意见是什么?”在您的问题中是一个危险的句子。如您所知,没有关于 Stack Overflow 的意见,只有事实。寻求意见只会让你的问题结束。已经有 4 票接近;再进行一次接近投票将导致您的问题被关闭。
  • 为了保存问题,我将完全重写问题。我希望你没事。
  • 感谢克里斯的提醒和编辑。我没有意识到这一点。好吧,但它仍然关闭了?

标签: lisp scheme s-expression


【解决方案1】:

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

滥用对和列表来表示所有类型的数据是我喜欢称之为Lisp 程序员的疾病,而且这么多 Lisp 倡导者提倡它真是太可惜了。我不得不清理这些东西太多次了。

【讨论】:

  • sacundim,感谢您的清理。很长一段时间以来,我一直对这个列表和记录感到困惑。我想了解更多。但是谷歌搜索不会返回任何有用的结果。既然你说你已经清理了很多次了,如果它存在于某个地方,我想更多地看到它。谢谢。
【解决方案2】:

好问题! (好吧,无论如何,我喜欢克里斯对它的重写......)。根据我的经验,不正确的列表最常见的用途是轻量级的二元素结构。

推理是这样的:“哎呀,我需要一个双元素结构。哦,等等,为什么不直接使用 'cons'?它是内置的,并且内置的引用语法很好地支持它. 什么鬼,我会做的。”

特别是,诸如“assoc”之类的内置操作通常以假定给定一个不正确的二元素列表的列表的方式实现。

【讨论】:

    【解决方案3】:

    不正确列表的存在是基本构建块conscarcdr 存在的自然结果。这三个构成各种更复杂数据类型的基础是 lisp 的核心。以某种方式挑出不适当的驱逐名单将需要施加任意限制。

    【讨论】:

    • 不,不是。这实际上是 Lisp 是动态类型的(或者从 lambda 演算的角度来看,是无类型的)这一事实的产物。 Lisp 的静态类型类似物没有点列表,因为它们对应于cons 的类型将第二个参数限制为列表。例如,在 Haskell 中,我们有 (:) :: a -> [a] -> [a]: 运算符接受 aa 列表并返回 a 列表)。
    • 嘿,我不同意你们两个:)。构建动态类型语言很容易,其中 cons 只能在第二个元素是正确列表时使用。例如,请参阅 Racket 中的教学语言级别。例如,这有点像与 + 运算符相关的检查。 + 不适用于字符串,并且在应用时会进行检查。
    【解决方案4】:

    “不正确的列表”是对任何数据类型的模糊术语,而不是使用cons 构建的列表。

    正如 John 所说,一个示例是使用 cons 对,就像在 ML 中使用元组一样。

    另一个例子是列表的变体。例如,可以这样定义一个流:

    ;; 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)))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-27
      • 2020-09-12
      • 2017-12-29
      • 1970-01-01
      • 2013-04-07
      相关资源
      最近更新 更多