2015-11-13 38 views
2

我会通过的Haskell教程的名单,并声称:为什么要预先列入清单?

当心反复使用的长字符串++运算符时... Haskell有贯穿整个名单上的左侧行走++。 ...然而,使用:运算符(也称为cons运算符)将一些东西放在列表的开头是即时的。

但是,在我看来,事情应该是相反的。

:要经过列表中的所有元素,因为它需要所有的指标转移。 ++,在另一方面,可以只在列表的末尾追加一个新元素,并用它来完成,因此瞬间。

任何理解这种说法的帮助?

+6

这听起来像你只是混淆阵列,列表。 – 31eee384

+1

这可以使用链表来实现,而不需要保持指向末尾的指针。 – usr2564301

回答

5

Haskell中的列表只是一个单向链表。例如Char的列表是[],空列表或c : cs,其中cCharcsChar的列表。为了产生c : cs给定ccs,所有实施需要做的是分配带有标记的记录,该标记指示(:)以及指针ccs的副本。这非常便宜。

+0

所以我猜对了:)对此有何参考?它可以被认为是“Haskell的一部分”,或者是否可以自由地实现它呢? – usr2564301

+3

@Jongware我猜如果你猜测链表是用链表实现的,你猜对了。如果一个实现使用除链表之外的其他东西来实现链表,我会感到惊讶。 –

+1

@DanielLyons:但我不知道Haskell,这个问题并没有把它们叫做* linked * lists。列表可以通过各种方式实现 - 所有这些与OP提到的操作都会有所不同。从观察到的行为中,我推断出,因此列表必须作为链接列表实现。 – usr2564301