统一-fd
统一fd包为单个排序提供了通用函数一阶结构统一(想想Prolog中的编程,或类型推断中的元变量).图书馆是足以实现更高等级的系统Peyton Jones、Vytiniotis、Weirch、Shields,但要记住统一变量是类型推理的元变量,而不是类型变量。
生成警告/错误
这是一个简单的软件包,应该易于安装;然而,在较旧的设置中,您可能会遇到以下一些警告/错误。如果在建造过程中,您看到一些像这样的偏离线:
mkUsageInfo:内部名称?t{tva7XM}电视
请随意忽略它们。他们不应该引起任何问题,甚至尽管它们很难看。在较新版本中应修复此问题GHC的。有关更多详细信息,请参阅:
http://hackage.haskell.org/trac/ghc/ticket/3955
如果你收到一堆关于没有的类型错误MonadLogic公司
的实例状态T
,这意味着您的logict副本库不是根据我们使用的相同mtl编译的。收件人修复此问题,更新logict以使用相同的mtl。
便携性
已经努力使该包尽可能便携。但是,因为它使用装货单
monad和mtl-2打包它不能是H98或H2010。然而,它只使用以下通用应得到良好支持的扩展:
- 排名2类型
- 多参数类型类
- FunctionalDependencies——唉,这是类型推断所必需的。
- FlexibleContexts-MPTC实际使用所必需的。
- FlexibleInstances-实际使用MPTC所必需的。
- UndecidableInstances-需要
显示
实例。
描述
统一API在以下结构类型中是通用的在统一变量的实现中Sheard的两级珍珠(2001)。这种风格很好搭配尽管后者的实现是未包含在此软件包中。
也就是说,您只需定义其定点的函子是您感兴趣的递归类型:
--术语的非递归结构数据S a=。。。--递归项类型type PureTerm=修复S
然后为提供一个实例可统一的
,其中zipMatch(拉链匹配)
对术语执行一级相等测试并返回递归填充成对亚肢的一级脊柱选中(或没有什么
如果此级别不匹配)。
class(可遍历t)=>统一t,其中zipMatch::t a->t b->可能(t(a,b))
使用哪个变量实现的选择由类似的简单类变量
和绑定Monad
.我们存储显而易见,monad中的变量绑定。以防万一不明显,参见Dijkstra等人(2008)的基准演示天真地急于应用绑定的成本。
目前提供了两种变量实现:一种是基于STRef(参考)
s、 另一个基于一个带有国际地图
前者具有O(1)访问时间的优点,但后者速度非常快,并且有支持回溯的好处。回溯本身由logict包提供,如下所述Kiselyov等人(2005年)。
除此模块化之外,unification-fd还实现了一个数字对Sheard(2001)提出的算法的优化-这也是Cardelli(1987)提出的算法。
- 它们的实现使用了路径压缩,我们保留了这一点。虽然我们修改了压缩算法,以便分享可观察到的信息。
- 此外,我们执行攻击性机会主义观察共享,一种潜在的新方法,可以引入更多一元绑定提供的共享。基本上,我们这样做是为了使用提供的可观察共享通过尽可能多的修改路径压缩(没有引入任何新的变量)。
- 我们消除了臭名昭著的昂贵事件——检查、更换它带有访问设置(更懒散地检测循环项没有发生检查的渐进开销)。变体保持发生的统一-还提供了检查,万一你真的需要快速失败。
- 最后,API的一个高度实验性的分支执行加权路径压缩,这是渐近最优的。不幸的是,当前的实现比未加权版本,我还没有机会表演基准来查看常量因子的比较。因此这是一个实验分支。
这些优化通过了检测明显错误的测试套件。如果你发现任何错误,一定要让我知道。还有,如果你真的手头有统一的测试套件或基准套件,我想买一份。
注释和限制
参考文献
- 卢卡·卡德利(1987)
- 基本多态类型检查.计算机程序设计科学,8(2):147-172。
- Atze Dijkstra,Arie Middelkoop,S.Doaitse Swierstra(2008)
- 有效的函数统一和替换.技术报告UU-CS-2008-027,乌得勒支大学。
- Simon Peyton Jones、Dimitrios Vytiniotis、Stephanie Weirich和Mark屏蔽(2007)
- 任意库类型的实用类型推理.JFP 17(1)。在线版本有一些小的更正/澄清。
- Oleg Kiselyov、Chung chieh Shan、Daniel P.Friedman和Amr Sabry(2005)
- 回溯、交错和端接单声道变压器.ICFP。
- 蒂姆·谢尔德(2001)
- 通过两级类型和参数化模块的泛型统一,功能珍珠。ICFP。
- Tim Sheard和Emir Pasalic(2004)
- 两级类型和参数化模块.JFP 14(5):547–587。这是Sheard(2001)的扩展版本,有新的示例。
- Wouter Swierstra(2008)
- 数据类型如点菜,功能珍珠。JFP 18:423–436。
链接