【问题标题】:Is this the definition for a list using cons?这是使用 cons 的列表的定义吗?
【发布时间】:2017-06-30 11:28:39
【问题描述】:

在一篇论文中,我看到了一个列表的定义(T 是您想要的任何类型):

listof T ::= Nil | Cons T (listof T)

我认为这是说:

T 类型的列表定义为Nil 或函数cons 应用于T 类型列表的结果,其中cons 将列表与另一个列表链接(其余部分-可能是nil)。

这是一个准确的描述吗?

【问题讨论】:

  • 语法类似于 Haskell 中的 GADT:data Listof t = Nil | Cons t (Listof t)NilListof t 类型,Const -> Listof t -> Listof t 类型。
  • "cons 将列表与另一个列表链接" - 不! ConsT 类型的单个元素 与另一个列表链接。

标签: list functional-programming cons


【解决方案1】:

是的。这就是Lisp lists 的构造方式。

这是链表。由于NilCons 是内存中的一个对象,因此我们对列表中的每个元素都有一个对象。该对象具有 - 假设它是 Cons - 两个引用:一个指向列表在该位置保存的元素,一个指向链表中的下一个节点。

所以如果你存储一个列表(1,4,2,5),那么在内部,它被存储为:

+---+---+   +---+---+   +---+---+   +---+---+
| o | o---->| o | o---->| o | o---->| o | o----> Nil
+-|-+---+   +-|-+---+   +-|-+---+   +-|-+---+
  v           v           v           v
  1           4           2           5

或者你可以像Cons 1 (Cons 4 (Cons 2 (cons 4 Nil)))一样构造它。

Lisp 列表的概念在 functionallogic 编程语言中都非常流行。

使用链表通常需要编写与使用数组和数组列表不同的算法。获取第 k 个元素将需要 O(k) 时间,因此通常旨在防止这种情况发生。因此,人们通常会遍历列表并例如发出某些元素(例如,给定这些元素满足给定的谓词)。

【讨论】:

  • 你能推荐一个帮助你进一步阅读的参考吗?
猜你喜欢
  • 2018-01-08
  • 2021-12-27
  • 1970-01-01
  • 2010-11-21
  • 2013-05-12
  • 2011-05-25
  • 2018-11-29
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多