ret*_*nym 22
这是一个差异列表,沿着"差异列表作为功能"
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)
Run Code Online (Sandbox Code Playgroud)
高效的前期支出:
scala> l1 ::: l2 ::: l3
res8: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
Run Code Online (Sandbox Code Playgroud)
附加效率低下.这会创建一个中间列表(l1 ++ l2),然后((l1 ++ l2)++ l3)
scala> l1 ++ l2 ++ l3 // inefficient
res9: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
Run Code Online (Sandbox Code Playgroud)
DList
存储附加内容,只需要创建一个完整的列表,有效地调用:
scala> List(l1, l2, l3) reduceRight ( _ ::: _)
res10: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)
Run Code Online (Sandbox Code Playgroud)
Don*_*art 13
差异列表是一种类似于列表的数据结构,支持O(1)追加操作.
附加和修改列表的其他操作通过修改函数的函数组合来表示,而不是直接复制列表.
一个例子,来自Haskell的dlist库:
-- 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
Run Code Online (Sandbox Code Playgroud)
该技术至少可以追溯到Hughes 84,一个新的列表表示及其对函数"reverse"的应用,R.John Hughes,1984.,其中,他建议将列表表示为函数,并附加为函数组合,允许例如反向运行在线性时间.从论文:
归档时间: |
|
查看次数: |
3226 次 |
最近记录: |