什么是DList?

时间:2010-07-28 11:37:49

标签: list scala data-structures append scalaz

我尝试使用Google搜索,但我得到的只是关于小名人的故事。鉴于缺乏文档,什么是DList

4 个答案:

答案 0 :(得分:21)

这是一个差异列表,与"Difference List as functions"

一致
scala> val (l1, l2, l3) = (List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))
l1: List[Int] = List(1, 2, 3)
l2: List[Int] = List(4, 5, 6)
l3: List[Int] = List(7, 8, 9)

高效的前期支出:

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

附加效率低。这创建了一个中间列表(l1 ++ l2),然后((l1 ++ l2)++ l3)

scala> l1 ++ l2 ++ l3  // inefficient
res9: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

DList存储附加内容,只需要创建一个完整列表,有效地调用:

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

答案 1 :(得分:11)

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

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

一个例子,来自Haskell's dlist library

-- 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

这项技术至少可以追溯到Hughes 84一个新的列表表示及其在“反向”函数中的应用,R。John Hughes,1984。,他建议将列表表示为函数,并附加为函数组合,允许例如反向运行在线性时间。来自论文:


enter image description here

enter image description here


答案 2 :(得分:2)

它是非规范scalaz包中的数据类型,对于两端都有固定时间访问的类型列表非常有用。 (诀窍是google for“scala”和“dlist”。)

答案 3 :(得分:1)

来自project page of scalaz

  

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