List 什么是数据列表?

List 什么是数据列表?,list,scala,data-structures,append,scalaz,List,Scala,Data Structures,Append,Scalaz,我试着在谷歌上搜索这个,但我得到的只是一些小名人的故事。鉴于缺乏文档,什么是?它是非规范包中的一种数据类型,对于两端都有固定时间访问的类型化列表非常有用。(诀窍是用谷歌搜索“scala”和“dlist”。来自: DList,一种数据类型,用于表示具有固定时间追加/前置操作的相同类型的元素 这是一个不同的列表,大致如下 高效预编: scala> l1 ::: l2 ::: l3 res8: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) 低效的附加。

我试着在谷歌上搜索这个,但我得到的只是一些小名人的故事。鉴于缺乏文档,什么是?

它是非规范包中的一种数据类型,对于两端都有固定时间访问的类型化列表非常有用。(诀窍是用谷歌搜索“scala”和“dlist”。

来自:

DList,一种数据类型,用于表示具有固定时间追加/前置操作的相同类型的元素


这是一个不同的列表,大致如下

高效预编:

scala> l1 ::: l2 ::: l3
res8: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
低效的附加。这将创建一个中间列表(l1++l2),然后((l1++l2)+l3)

DList
存储附录,只需创建一个完整列表,即可有效调用:

scala> List(l1, l2, l3) reduceRight ( _ ::: _) 
res10: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

差异列表是一种类似列表的数据结构,支持O(1)追加操作

追加和其他修改列表的操作通过修改函数的函数组合来表示,而不是直接复制列表

例如,来自:

该技术至少可以追溯到R.John Hughes,1984年提出的列表的一种新表示及其在函数“reverse”中的应用,其中,他提出将列表表示为函数,并将其附加为函数组合,从而允许例如reverse在线性时间内运行。从报纸上看:




我点击这个问题只是为了有机会对名人做一个有趣的评论。但问题已经存在了+1我假设发现非scala specificDList溢出堆栈并从Scalaz中删除:@WillSargent DList于2011年添加回Scalaz是否在常规scala列表的前面加上:::前缀长度仍然是线性的?或者是否有一些额外的代码利用它们的不变性做得更好?对于
DList
,总操作仍然是
O(n*m)
,其中
n
是块的数量,
m
是块的大小。使用
++
,操作是
O(n*n*m)
最好添加
a->dlista
示例:
singleton=\a->DL(:)a)
scala> l1 ++ l2 ++ l3  // inefficient
res9: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
scala> List(l1, l2, l3) reduceRight ( _ ::: _) 
res10: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
-- Lists as functions
newtype DList a = DL { unDL :: [a] -> [a] }

-- The empty list
empty       = DL id

-- The append case: composition, a la Hughes
append xs ys = DL (unDL xs . unDL ys)

-- Converting to a regular list, linear time.
toList      = ($[]) . unDL