List 通过函数组合实现高效的列表追加/前置

List 通过函数组合实现高效的列表追加/前置,list,haskell,function-composition,List,Haskell,Function Composition,几个月前,我在某个地方读到一种有效的方法,通过使用函数组合来表示列表,将列表附加到O(1)中的其他列表并在其前面加上前缀。函数组合一经计算,就会在O(n)中生成结果列表 不幸的是,我记不起本文的来源或(如果有的话)这种技术/方法的名称。你有关于它的参考资料吗?你一定在想前奏曲中的节目和朋友。请参阅。数据结构称为差异列表(简称DList)。您可以找到它的默认实现 正如您所提到的,可以从中收集完整的描述。太好了,谢谢!这正是我要找的。在谷歌上搜索一下DList,我发现我实际上是在搜索唐·斯图尔特的《

几个月前,我在某个地方读到一种有效的方法,通过使用函数组合来表示列表,将列表附加到O(1)中的其他列表并在其前面加上前缀。函数组合一经计算,就会在O(n)中生成结果列表


不幸的是,我记不起本文的来源或(如果有的话)这种技术/方法的名称。你有关于它的参考资料吗?

你一定在想前奏曲中的
节目和朋友。请参阅。

数据结构称为差异列表(简称
DList
)。您可以找到它的默认实现


正如您所提到的,可以从中收集完整的描述。

太好了,谢谢!这正是我要找的。在谷歌上搜索一下
DList
,我发现我实际上是在搜索唐·斯图尔特的《真实世界哈斯克尔》第13章。。。下面是关于这些列表如何工作的完整解释:请在答案中添加一个指向该书的链接,作为将来的参考?ThanksIt也在LYAH:“差异列表”一章中提到@Riccardo最初的差异列表当然是在Prolog中产生的,它只包含一个单独链接的列表,该列表还包含指向其最后一个cons单元格的指针,因此可以有效地扩展它。在Haskell中的非回溯式Prolog中,一旦设置了指针,就不能更改它。它很容易用C实现,并且可以通过在数据结构中添加另一个数据字段length使其看起来不可变,因此不允许通过该点进行访问。扩展它将创建一个新长度的副本,但其基础列表相同。(实现者,注意!):@WillNess:我在Prolog中使用了好几次差异列表,但直到您的精确化,我才将它们与此实现联系起来。谢谢@里卡多:不客气。:)由于它们通常在序言中呈现出巨大的神秘性,我花了一些时间才意识到它们到底是什么。开放列表是一个前置承诺,Haskell中的承诺是一个函数。这里还有另一个例子:corecursion==尾部递归模cons。至少我认为是这样打结在序言中是轻而易举的事,因为它被明确地设置了一次,等等。第一次出现(可能)是在约翰·休斯的一篇论文中,“列表的一种新表示及其对函数‘反向’的应用”(我相信在此之前它们是民间传说)——因此它们也被称为休斯列表。请注意,它们只支持有效的构造—Hackage上的DList包有一个支持内省的API,但要实现内省,您必须变形为常规列表并再次退出。这是低效的——如果你想要内省,你就需要一个不同的结构。当不需要内省时,这是一个足够公平的权衡。谢谢你指出这一点。我现在不是在寻找要使用的数据结构,但是,我只是想研究difference/Hughes列表的实现。