数据清单:差异列表

[bsd3型数据图书馆][建议标签]

支持O(1)append和snoc操作的类列表类型。


[跳到自述]

模块

[索引] [快速跳跃]

标志

手动标志

姓名描述违约
韦罗

启用-错误

残疾人

使用-f<标志>启用标志,或-f-<标志>禁用该标志。更多信息

下载

注意:此软件包具有元数据修订在阴谋集团的描述中比tarball中包含的更新。要打开包含修订的包,请使用“cabal-get”。

维修人员角落

包装维护人员

对于包维护者和黑客托管者

候选人

版本[RSS公司] 0.20.30.3.10.3.20.40.4.10.50.60.6.0.10.70.7.0.10.7.10.7.1.10.7.1.20.80.8.0.10.8.0.20.8.0.30.8.0.40.8.0.50.8.0.60.8.0.70.8.0.81
更改日志 changelog.md
依赖项 基础(>=4 && <5)deepseq公司(>=1.1&&<1.6)[细节]
许可证 BSD-3条款
版权 2006-2009 Don Stewart,2013-2020 Sean Leather,2017-2020 Oleg Grenrus,撰稿人
作者 人斯徒瓦特
维护人员 Sean皮革<sean.lateher@gmail.com>
修订过的 第1次修订制造商安德烈亚斯·阿贝尔2023-08-31T20:10:00Z
类别 数据
主页 https://github.com/spl/dlist网站
Bug跟踪器 https://github.com/spl/dlist/issues
源回购 头部:git克隆https://github.com/spl/dlist.git
已上传 通过Sean皮革2020-07-18T22:00:05Z
分配 架构(architecture):1,借方:0.8.0.8,费多拉:1,免费BSD:0.7.1.1,LTSHaskell公司:1,NixOS:1,堆叠:1,openSUSE(打开SUSE):1
反向依赖项 228直接,14458间接[细节]
下载 总计413854(过去30天内为355)
额定值 2.0(票数:1)[估算人贝叶斯平均]
您的评分
  • λ
  • λ
  • λ
状态 可用文档[生成日志]
上次成功报告时间:2020-07-18[所有1个报告]

dlist-1.0自述文件

[返回包描述]

差异列表

测试数据库 黑客徽章 packdeps-徽章

支持O(1)的列表类型追加势利小人操作。

安装

数据清单Haskell软件包可以从黑客攻击.它可以与一起安装阴谋集团堆栈.

请参阅更改日志针对每个版本中的更改。

用法

下面是一个“展平”a的示例到其元素列表中叶子施工人员:

导入合格数据。DList as DList(作为DList列出)数据树a=叶a|分支(树a)(树a)展平速度慢::树a->[a]展平慢速=开始哪里go(叶x)=[x]go(向左向右分支)=向左+向右快速展平::树a->[a]flature Fast=DList.toList。哪里go(叶x)=DList.singleton xgo(Branch left right)=向左移动`DList.append`向右移动

(上述代码可在基准.)

展平速度慢可能比快速展平:

  1. 展平速度慢使用++串联列表,每个列表都是递归的左边正确的 中的值分行构造函数。

  2. 快速展平不使用++而是构建一个功能组合,每一个都是由DList.singleton列表((x:)). 这个功能D列表到列表将组合函数应用于[],正在构造最后是一个列表。

要了解两者之间的差异展平速度慢快速展平,考虑一些应用于:

平展缓慢(分支(分支(叶'a')(叶'b'))(叶'c'))=go(分支(分支(叶'a')(叶'b'))(叶'c'))=go(分支(叶'a')(叶'b'))++go(叶'c')=(go(叶子'a')++go(树叶'b'))++“c”=(“a”++“b”)++“c”=('a':[]++“b”)++“c”=('a':“b”)++“c”=“a”:“b”++“c”=“a”:“b”:[]++“c”=“a”:“b”:“c”
flawnFast(分支(分支(叶“a”)(叶“b”))(叶“c”))=toList$go(分支(分支(叶'a')(叶'b'))(叶'c'))=toList$go(分支(叶'a')(叶'b'))`append`go(叶'c')=unsafeApplyDList(go(分支(叶'a')(叶'b')))。unsafeApplyDList(go(叶'c'))$[]=unsafeApplyDList(go(分支(叶'a')(叶'b')))=unsafeApplyDList(go(分支(叶'a')(叶'b')))=unsafeApplyDList(go(分支(叶'a')(叶'b')))=unsafeApplyDList(go(分支(叶'a')(叶'b')))“c”=unsafeApplyDList(不安全列表(unsafeAppleDList)(go(叶'a'))。unsafeApplyDList(go(叶'b')))“c”=unsafeApplyDList(go(叶'a'))=unsafeApplyDList(go(叶'a'))=unsafeApplyDList(go(叶'a'))=unsafeApplyDList(go(叶'a'))('b':“c”)=unsafeApplyDList(单例'a')('b':“c”)=不安全应用DList(不安全列表((:)'a'))('b':“c”)=“a”:“b”:“c”

左翼阵营++在里面展平速度慢中间列表构造的结果在评估最外层时立即丢弃的++。在另一方面,对快速展平不涉及中间列表结构,而非功能应用和新型构造函数包装和展开包装。这就是效率的来源。

警告!请注意,上面有一些事实,但也有很多省力和内在复杂性。例如,可能存在GHC重写适用于的规则++,这将改变实际评估。和,共当然,严格、懒惰和分享都起着重要作用。同样,不是中的每个函数数据清单套餐对于任何情况都是最有效的。

故事的寓意:如果您正在使用数据清单要加快代码速度,请检查确保它确实如此。基准!

设计说明

以下是针对数据清单包裹。

避免++

休斯将列表表示为一级功能的初衷是提供一个抽象,以便列表追加在中找到操作函数式编程语言(现在称为++Haskell)不会出现在左列的位置以避免与列表相同的重复结构构建。多年来,许多使用list的人吸取的教训是这个追加有时令人惊讶的是,操作可能会出现在他们不知道的地方期待吧。

我们的目标之一是数据清单软件包以避免让用户惊讶意外插入++。为此,应该有一个最小集的函数数据清单在哪儿++可以直接或间接找到。这个已知用途列表++包括:

  • D列表:来自列表来自字符串阅读
  • DN非空:从列表来自非空来自字符串阅读

如果任何未来请求的功能涉及++(例如,通过来自列表),负担包容性高于其他情况。

抽象

这个D列表表示及其支持功能(例如。追加势利小人等)依赖不变量来保持其安全使用。就是说,没有这个不变量,用户可能会遇到意外的结果。

(我们使用的安全性是指语义定义明确且符合预期,不是指参照透明的一面。不变量不直接导致副作用数据清单包,但程序使用不安全生成D列表可能会做出令人惊讶的事情。)

不变量是,对于任何xs::D列出:

fromList(toList xs)=xs

要查看如何打破此不变量,请考虑以下示例:

xs::D列出xs=不安全列表(const[])fromList(toList(xs`snoc`1))=fromList(toList(不安全列表(const[])`snoc`1)=fromList(toList(不安全列表(不安全应用DList(不安列表(const[])))。(x:))=fromList(toList(不安全列表(常量[].(x:)))=fromList(($[])。unsafeApplyDList$UnsafeDList(常量[].(x:))=来自列表(常量[].(x:)$[])=fromList(常量[][x])=来自列表[]=不安全列表(++[])

不变量也可以表示为:

toList(fromList(toList xs))=toList x

我们可以将示例重申为:

toList(fromList(toList(xs`snoc`1))=toList(不安全列表(++[]))= []

如果发现这一点,那将是非常无益和令人惊讶的(xs`snoc`1)结果是成为空列表。

保持上的不变量D列表,我们在数据。D列表模块。建造师,不安全列表和记录标签,不安全应用DList,不会导出,因为可以使用这些,如上所示,打破不变量。

尽管如此,仍有许多人要求出口D列表构造函数。我们不相信这是必要的,但我们相信用户应该自己决定。

使用的构造函数和记录标签D列表,您可以按如下方式导入它们:

导入数据。D列表。不安全(DList(不安全DList,不安全应用DList))

如果你正在使用Safe Haskell,你可能需要在你的模块:

{-#LANGUAGE值得信赖#-}

请注意,安全证明的责任在于你。

工具书类

这些是各种参考资料,您可以从中了解更多关于差异列表的信息。

研究

  • 列表的一种新表示及其在函数中的应用“反向。”约翰·休斯。信息处理信函。第22卷第3期。1986-03. 第141-144页。PDF格式

    这是列表表示的原始发布源一流的功能。

背景

博客和邮件列表

许可证

BSD 3条款“新”或“修订”许可©Don Stewart,Sean Leather,版权所有,贡献者