我会通过的Haskell教程的名单,并声称:为什么要预先列入清单?
当心反复使用的长字符串++运算符时... Haskell有贯穿整个名单上的左侧行走++。 ...然而,使用:运算符(也称为cons运算符)将一些东西放在列表的开头是即时的。
但是,在我看来,事情应该是相反的。
:
要经过列表中的所有元素,因为它需要所有的指标转移。 ++
,在另一方面,可以只在列表的末尾追加一个新元素,并用它来完成,因此瞬间。
任何理解这种说法的帮助?
我会通过的Haskell教程的名单,并声称:为什么要预先列入清单?
当心反复使用的长字符串++运算符时... Haskell有贯穿整个名单上的左侧行走++。 ...然而,使用:运算符(也称为cons运算符)将一些东西放在列表的开头是即时的。
但是,在我看来,事情应该是相反的。
:
要经过列表中的所有元素,因为它需要所有的指标转移。 ++
,在另一方面,可以只在列表的末尾追加一个新元素,并用它来完成,因此瞬间。
任何理解这种说法的帮助?
Haskell中的列表只是一个单向链表。例如Char
的列表是[]
,空列表或c : cs
,其中c
是Char
和cs
是Char
的列表。为了产生c : cs
给定c
和cs
,所有实施需要做的是分配带有标记的记录,该标记指示(:)
以及指针c
和cs
的副本。这非常便宜。
所以我猜对了:)对此有何参考?它可以被认为是“Haskell的一部分”,或者是否可以自由地实现它呢? – usr2564301
@Jongware我猜如果你猜测链表是用链表实现的,你猜对了。如果一个实现使用除链表之外的其他东西来实现链表,我会感到惊讶。 –
@DanielLyons:但我不知道Haskell,这个问题并没有把它们叫做* linked * lists。列表可以通过各种方式实现 - 所有这些与OP提到的操作都会有所不同。从观察到的行为中,我推断出,因此列表必须作为链接列表实现。 – usr2564301
这听起来像你只是混淆阵列,列表。 – 31eee384
这可以使用链表来实现,而不需要保持指向末尾的指针。 – usr2564301