没有合适的资源?快使用搜索试试~ 我知道了~
拉链结构化编辑器:理论计算机科学电子笔记中的应用与优势
理论计算机科学电子笔记253(2010)3-18www.elsevier.com/locate/entcs加强拉链特里斯坦手术室奥尔伍德1号 苏珊·艾森巴赫2帝国理工学院计算机系英国伦敦摘要zipper是一种众所周知的设计模式,用于向数据结构提供类似于指针的接口然而,Huet的经典论文只是触及了它的一些潜在应用的表面。在本文中,我们从Huet的灵感,并描述了一个适合作为结构化编辑器的基础库。我们考虑一个拉链结构,是适合遍历异构数据类型,编码路由到树中的其他地方(书签或快速跳转功能),表达词法绑定的信息,使用上下文,和遍历呈现程序指示光标当前的焦点。关键词:zipper,cursor,boilerplate,bookmarks,traversal,generalized algebraic data types1介绍我们最近发现自己实现了一个交互式工具,用于可视化和操作扩展的λ-演算FC[7],这是GHC中使用的当前显式类型的中间语言。我们的编辑器允许用户查看整个FC术语(例如,一个Haskell函数翻译成FC)。用户有一个光标,它指示具有焦点的整个术语的当前子术语。然后,用户可以对当前子项进行操作,例如在子项内的第一个可用位置应用β-归约简化或展开全局定义。该工具提供了当前在光标位置范围内的变量的视图该工具提供了内部数据结构的几个视图,用户可以通过渲染的输出来操作它,而输出只是一个视图。1电子邮件:tristan. imperial.ac.uk2 电子邮件:susan. imperial.ac.uk1571-0661 © 2010 Elsevier B.V. 在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2010.08.0284T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3Fig. 1. 我们的互动核心编辑。我们希望支持书签,即,能够将子项标记为书签,然后将光标返回到该位置。然而,如果用户通过操作子项对术语进行了更改,我们希望能够检测哪些书签可能因该更改而无效,并以某种方式修复它们。在实现过程中,我们开发了一个基于设计模式的内部数据结构,该设计模式在许多方面与经典zipper类似[1]。然而,我们必须解决原始论文没有涉及的几个问题这些问题与遍历有关,以便呈现不同的UI视图,并且由于我们的底层术语语言由几个(可能)相互递归的数据类型组成而变得复杂。基于我们在实现这个工具方面的经验,我们开发了一个库CLASE,它可以在一组数据类型上提供光标数据结构,以及用于移动焦点的接口,以及遍历光标以执行诸如渲染之类的操作。本文的其余部分组织如下:我们从第2节开始,用一个简单的例子勾勒出游标的底层设计,激励我们使用广义代数数据类型(或GADT,[11])来允许我们创建可以遍历异构数据类型的游标。然后,我们将在第3节中介绍CLASE,它使用的光标以及用户如何移动光标。在第4节中,我们讨论了在试图呈现游标时可能发生的一些重复和复杂性T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)35数据线=根经验数据扩展=Abs字符串类型Exp|应用程序扩展扩展| 瓦尔河数据类型=单位|Arr Type类型图二. Lam语言(to例如,在一个实施例中,aString),并概述CLASE如何使用户更容易、更习惯地执行此操作。CLASE的另一个特性是它支持将书签添加到光标中,这将在第5节中解释。最后,在第六节中,我们概述了相关的工作和结论。2上下文和简单光标为了演示我们的技术,我们创建了小语言Lam,如图2所示。Lam类型标记了我们程序的根,它的唯一构造函数Root是Lam表达式的简单包装器。3表达式是lambda抽象,Abs,它携带一个字符串名称的变量,一个类型的变量和一个表达式,其中变量是在范围内。应用表达式是两个表达式相互之间的熟悉应用。变量表达式带有de Bruijn索引[9],指示哪个封闭Ab绑定此Var引用的变量。类型可以是箭头类型Arr,也可以是一些概念上的单位类型Unit。下面的Lam程序表示项λx::τ → τ。(x λ y::τ. (y=x)):Root(Abs“x”(Unit(Var0)一个简单的光标是一对值(即,subterm)当前处于焦点中(有时在下文中称为它),以及一些上下文,这将允许重建整个术语。我们的游标类似于拉链设计模式,允许O(1)的上下移动在向下的方向上,有一些方法可以选择应该访问哪个孩子。在图3中,我们看到一个光标在Lam值上移动:根((Abs“x”(Unit3Lam指的 是“ 语 言 ” , 由 L a m 、 E x p 和 T y p e 类 型 定 义 。6T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3光标当前焦点上下文列表Arr上下文它单元单元变量1变量0绝对值“x”当前焦点上下文列表Arr变量1变量0单元单元光标它 上下文ExpToApp0ExpToRootØ光标它 上下文光标当前焦点上下文列表绝对值“x”App根上下文它Ø单元单元变量0Arr变量1(a)中的光标开始聚焦在Root构造函数处。由于这个构造函数位于术语结构的“顶部”,因此上下文是空的。然后在(b)中,我们将光标向下移动,所以焦点在App构造函数上,这样我们就在上下文的前面添加了一个Context构造函数(这里是ExpToRoot上下文构造器显式地见证需要应用于当前焦点的更改,以便重建树的一层。在(c)中,将焦点移动到应用程序左侧的Abs构造函数上,将新的构造函数推到上下文上。ExpToApp 0表示焦点位于App节点的第一个Exp子节点中,并携带App节点的右侧子节点(变量1)的值。在(d)中再次向下移动将焦点放在Abs节点的Type子节点内的Arr构造函数上,并再次推送适当的上下文构造函数,以便在用户希望向上移动时能够重建Abs节点类型ToAbs“x”ExpToApp0ExpToRootØ图三.光标结构因移动焦点而为了能够轻松地移动,给定我们的原始数据类型(Lam,Exp和Type),我们需要上下文构造器来表示游标的所有可能上下文我们使用GADT将上下文构造函数期望的“缺失值”类型以及它们最终表示的构造函数类型推入类型系统稍后我们将使用这些额外的信息来帮助维护一些通用的不变量,并作为一个健全的检查,我们的游标实现是当前焦点ØExpToRoot上下文列表绝对值“x”App单元单元变量0Arr变量1T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)37正确.数据上下文from towhereExpToRoot::Context Exp LamExpToApp 0::Exp→Context ExpExpTypeToAbs::String→Exp→上下文类型Exp...正如我们在图中看到的,当我们移动术语时,我们建立了一个上下文堆栈。如果我们的上下文是普通的数据类型,我们可以使用列表,但是我们需要确保第一个Context的to参数与下一个Context的from参数相匹配。为此,我们使用了一种名为Path的新数据类型。dataPath ctr from to whereStop::Path ctr anywhere anywhere步骤::(. . )从中间的路径ctr→从中间到路径ctr→从到路径ctrStop类似于列表末尾的nil[ ],Step类似于cons:。由于Step中的中间位置middle是存在性量化的,我们需要提供一种方法来在以后提取它的类型,从而提取(目前未指定的)类约束。我们的基本游标结构就是:dataCursorhere=Cursor{it::here,context::Path Context here Lam}当前的焦点由它表示,我们所处的上下文是从这里到我们语言的根Lam的路径。我们的库CLASE中的游标数据结构以两种有用的方式扩展了这种数据类型3CLASE我们现在介绍我们的库CLASE,这是一个结构化编辑器的游标库。4如图4所示,CLASE的典型使用包括三个部分。有开发人员必须编写的代码,通常是表达要在结构上编辑的语言的数据类型(例如,Lam数据库),一些在第4节中讨论的用于渲染的特定类型类,当然还有使用CLASE本身的应用程序。CLASE然后提供了一些Template Haskell脚本来自动生成一些样板代码,以及一个用于构建、移动和使用CLASE游标的通用函数API。4它可以从[8]下载文档8T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3用户代码CLASE自动生成代码模板Haskell数据类型(例如LAM)UI应用适配器实例实例Traffic实例语言Traffic适配器实例绑定课堂语言Traxis类类绑定书签API移动API穿越API图四、使用CLASE的概述CLASE要求用户实现一个名为Language的类型类,如图5所示。实例应该是位于根的类型。因此,对于我们的Lam示例,我们将创建一个实例Language Lam。一种语言需要有数据类型(使用相关的数据类型家族表示[12])对应于它的上下文,原语运动和反映语言中不同类型的方式(TypeRep)。上下文Lam如前所示。基元移动是GADT构造函数,它见证了光标可以做的所有一步向上或向下移动。例如,对于Lam,它们将是:数据移动d a b,其中MUp::Movement Down b a→Movement Upa b MRootToExp::Movement Down LamExp MAppToExp0::Movement Down ExpExp MAbsToType::Movement Down ExpType...在语言中反映不同类型的方法由一个简单的GADT提供:dataTypeRepa 其 中ExpT : : TypeRepExpLamT::TypeRepLamTypeT::TypeRep Type然后,用户将其链接到类型类Reify,这提供了一种有时更方便的传递见证人的方式。RostsR是一种数据类型,它为由语言中的某些类型参数化的内容提供了一个存在性包装。T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)39类语言l,其中数据上下文l::→ →data移动l::→数据类型Rep l::→buildOne::Context l a b→a→bunbuildOne::Movement l Down a b→a→Maybe(Context l b a,b)invert运动::运动l d a b→运动l(Invert d)b a运动Eq::运动l d a b→运动l d a c→可能(TyEq b c)reify方向::运动l d a b→方向T dcontextToMovement::Context l a b→Movement l Up a bdownMoves::TypeRep l a→[返回列表R l(移动l向下a)]moveLeft::Movement l Down a x→Maybe(Movement l Down a))moveRight::Movement l Down a x→Maybe(Movementl Down a))类Reify l a其中reify::a→TypeRep l adata_transmittsR_l(r::n →n),其中stsR::(Reify l a)数据向上数据向下typefamily Invert d::类型实例Invert Up=Down类型实例Invert Down=UpdataDirectionT a其中UpT::DirectionT UpDownT::DirectionTDown数据TyEq a b,其中Eq::TyEq a a图五、语言类型类和支持的数据结构和类型声明了这些数据类型后,用户必须提供一些原始函数,这些函数在给定Context和它我们还要求所有的运动都是可逆的(invertMovement),并且可以测试相等性(movementEq)。在两个移动相同的情况下,移动相等需要提供类型相等见证。所有Movements只能向上或向下移动,这是reifyDirection所要求的,并且所有Contexts必须对应于向上移动(contextToMovement)。最后,为了提供不需要显式见证的更通用的上/下/左/右移动操作10T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3逻辑上向左或向右移动向下移动(moveLeft和moveRight)。例如,moveLeftMAbsToExp=Just(Just_stsR_MAbsToType)对于简单的语言,比如我们的Lam语言,Language的实例是直接的,并且很容易机械地推导出来。对于这些语言,我们提供了一个Template Haskell函数,它可以自动生成一个包含Language Lam实例的模块。由于Template Haskell的当前状态排除了GADT和相关数据类型的内联生成,我们的生成函数将模块输出为源文件,可以稍后导入CLASE提供的Template Haskell脚本要求用户指定创建Language实例的模块、根数据类型(Lam)以及光标应该能够在其间导航的类型(Lam、Exp和Type)。库用户使用拼接调用脚本,$(. ),并使用TH quasiquotes(“)引用根类型和可导航类型$(languageGen[“Lam”,“Language”]”[languageGen函数通过使用THreify来访问Lam,Exp和Type数据类型的形状,然后处理这些数据类型以计算出简单的上下文,并从那里计算出简单的运动和原始函数的实现,如buildOne和unbuildOne。通过适当的Language实例化,CLASE提供了用于表示和操作游标的库函数和数据类型核心Cursor数据结构是前面看到的Cursor它现在由三个类型参数化;l是用于实例化该Cursor所用于的Language类型类的相同类型,x用于类似书签的行为,将在第5节中讨论,a是当前焦点的类型。it和ctx是当前的焦点和上下文,对于书签行为,我们还添加了一个日志字段,这将在第5节中再次讨论。dataCursor l x a=(Reify l a)Cursor{it::a,ctx::Path l(Contextl)a l,log::Route l a x}CLASE提供了两种移动光标焦点的方法。第一种是应用Language实例中描述的特定移动的方法这是通过一个函数applyMovement实现的:applyMovement::(Language l,Reify l a,Reify l b)移动l d a b→光标l x a →可能(光标l x b)因此,给定一个从a到b的移动(在任一方向上),以及一个光标聚焦在a上,您将返回一个光标聚焦在b上。这是一个非常有用的函数,如果T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)311GUI想要围绕已知的树结构应用一组移动。然而,它确实需要事先知道光标当前焦点的类型,以及你有一个CLASE还提供了一组广义移动操作符。这些不需要调用上下文来了解它们所应用的Cursor的任何信息。一般有四种方法可以在树中移动,向上,深度优先向下,或者向左/向右移动到当前位置的相邻兄弟节点。 因为它不知道在应用这些操作之一之后Cursor的焦点将是什么类型,它们返回Cursors,其类型已存在量化。dataCursorWithMovement l d x from whereCWM::(Reify l to)将光标l x改为→Movement l d from to→CursorWithMovement l d x fromgenericMoveUp::(语言l)Cursor l x a→Maybe(CursorWithMovement l Up xa)genericMoveDown::(Language l)光标l x a→可能(CursorWithMovement l Down x a)genericMoveLeft ::(Language l)Cursor l x a→可能(光标R l(光标l x))genericMoveRight::(Language l)光标l x a→可能(光标R l(光标l x))在genericMoveUp/Down的情况下,我们还返回了Movement构造函数,如果应用程序发现它有用,可以通过applyMovement调用来实现相同的效果4渲染和绑定使用结构化编辑器要做的事情之一是显示内容,指示当前焦点所在的位置。假设你想提供一个文本渲染,给定我们的一个光标,这将需要你:(i) 转换焦点的值(即,Lam、Exp或Type)转换为字符串。(ii) 修改呈现焦点的String值以指示当前焦点(例如,把它用标记括号括起来<“)。(iii) 渲染所有的上下文构造函数,将该构造函数下面的字符串作为字符串传递进来,用作构造函数中“洞”的值在图6中,我们概述了我们第一次尝试的一部分,只渲染表达式和上下文,忽略了将上下文结果折叠到彼此中所需的控制流程。由于Lam语言具有绑定变量,我们希望在变量位置中呈现它们的名称,因此我们在一些虚构的monadM中执行计算,并使用其API函数addBinding为子计算中的新变量提供绑定12T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3renderExp::Exp→M StringrenderExp(Abs str ty exp)=dotys←renderType类型rhs←addBinding str(renderExp exp)return(“λ“++str++“:“++tys++“. “++rhs)...renderCtx::Context Lam from to→M String→MString renderCtx(TypeToAbs str exp)rec=dotys←recrhs←addBinding str(renderExp exp)return(“λ“++str++“:“++tys++“. “++rhs)renderCtx(ExpToAbs str ty)rec = dotys←renderType tyrhs←addBinding str recreturn(“λ“++str++“:“++tys++“. “++rhs)...addBinding::String→M a→M a...见图6。 第一次尝试渲染Lam光标的部分内容从示例中可以清楚地看出,代码是高度重复的,并且何时调用addBinding的逻辑与用于呈现和遍历的代码混合在一起。在实践中,我们发现这种绑定代码很难管理(特别是当语言变得更加复杂时),并且重复非常不可取。在CLASE中,我们通过完全分解绑定代码来解决这个问题,然后提供适配器来使编写呈现代码更加分解。CLASE有一个类型类Bound,它允许用户使用为其语言生成的上下文构造函数来表达绑定约束。直觉上,当遍历通过树向下移动到构造函数所描述的class(Language l)Bound l t其中bindingHook::Context l from to→t→t对于Lam语言,我们上面的渲染代码的一个合适的实例是,每当我们从Exp子对象移动到Abs时,将hole值包装在addBinding实例Bound Lam(M a),其中bindingHook(ExpToAbs str)hole=addBinding str holebindingHookhole=holeT.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)313CLASE还提供了一个组合子,用于在Cursor上进行类似渲染的遍历。它是一个带有签名的库函数:completeTraffic::请输入t x a. (Traffil t)光标l x a→tTraffic类型类包含用于执行上面列出的三个操作的函数但是,CLASE并不要求用户直接实现这个类型类,而是提供了另一个Template Haskell脚本,用于在某些适配器的实例中自动创建Trastory我们的TH脚本(adapterGen)为Lam生成以下代码。类LamTraversalAdapterExp t,其中visitAbs : : Exp→t→tvisitApp : : Exp→t→tvisitVar::Exp→tclassLamTraversalAdapterLam t,其中visitLam::Lam→t→tclassLamTraversalAdapterType t,其中visitUnit::Type→tvisitArr::Type→t→tclassLamTraversalAdapterCursor t,其中visitCursor::Lam→t→t实例(LamTraversalAdapterLam t,LamTraversalAdapterExp t,LamTraversalAdapterType t,LamTraversalAdapterCursor t,Bound Lam t)束缚Lam t在哪里...例如,渲染抽象构造函数的用户逻辑现在仅限于LamTraversalAdapter中visitAbs函数的实例:实例LamTraversalAdapterExp(M String),其中visitAbs(Abs str)ty exp=dotys←tyexp←expreturn(“λ“++str++“:“++tys++“. “++exps)...使用API很简单,给定上面适配器的用户实例,然后将Cursor转换为M String只是在正确类型的上下文中调用completeTraffic的情况14T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3__render::Cursor Lam x a→MString render=completeTraffic5路线和书签使用CLASE开发的编辑器可能希望跟踪树中的多个位置(例如,以提供书签或快速跳转功能)。理想情况下,我们希望这些书签在树的更新过程中是持久的,如果这不可能,那么就有一些方法来处理现在无效的书签。树中的任何位置都可以通过一系列向上移动,然后是一系列向下移动从任何其他位置到达。使用前面的Path数据类型,我们可以将这些路由编码为新的CLASE数据类型Route:数据路由l从哪里路线::(Reify l mid)路径l(移动l向上)从中间→路径l(运动l向下)中间到→路线l从到这些可以通过禁止最后一个向上运动是第一个向下运动的逆运动而形成独特的路线,即,保持以下不变量route_invariant::(Language l)Routel fromto→Bool路由不变式(Route(Step mup Stop)(Stepmdown))=(<$isJust)(invertMovement mup路由不变(路由(步升)降)=route_invariant(路线起伏)route_invariant(路线停止)=TrueCLASE光标跟踪到某个标记位置的单个Route。我们提供了一个API,用于通过单个移动扩展当前路线,重置它,将两个路线连接在一起并使光标跟随路线。updateRoute::(Language l,Reify l a,Reify lb)运动l d a b→路线l a c →路线l b cresetLog::Cursor l x a→Cursor l aaappendRoute::(Language l,Reify l a,Reify l b,Reify l c)路线l a b→路线l b c →路线l a cfollowRoute::(Language l)光标l x a→路线l a c →可能(光标l x c)T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)315如果一个用户应用程序想要为多个不同的子项添加书签,这个API可以使之变得简单,并有助于确保应用程序用户应用程序的状态是Cursor,16T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3∃∃→一个空日志,以及一个整数到从游标当前位置到其他位置的路由的映射。例如,LamGUI可以使用以下内容:dataCursorHolder,其中CH::Cursor Lam a a→Map Int(路径Lam a)→CursorHolder Lam在当前位置创建一个新书签只是在书签的键处向Map中插入一个值RightstsR(Route Stop Stop)当GUI试图移动光标时,主循环将响应按键. 我们继续展开光标保持器并将genericMoveDown应用于光标。keypressDown::CursorHolder→CursorHolderkeypr essDownch@(CHcursor@Cursor{}bookmarks) =from可能bech$do(CWM cursorJ)←genericMoveDown cursor...在代码的这一点上,光标的类型是a。光标Lam a a,光标J是b。光标Lam ab,即,游标 J的日志字段给出了返回到a的路由。如果我们试图返回一个新的CursorHolder包含游标J(或resetLog游标J)和原始书签,这将是一个类型错误。类型系统强制我们更新所有的书签,使类型参数与新的游标参数相匹配。...letbookmarksJ=Map.map(λ(bm))blog((log cursorJ)书签letcursorJJ=resetLog cursorJ返回$CWM cursorJJ书签J跳转到书签的情况是使用CLASE检测当前关注的子项的改变是否会使书签无效也很容易。如果路由没有up组件,则它将仅指向当前子项内部,即,它的形状是“路停”什么的6结论最近在Haskell社区中有很多关于zipper数据结构的讨论。实用的、流行的应用程序[5]和通用库[4]正在基于原始论文[1]的基本思想出现。像我们的图书馆一样,这些例子采用了上下文和焦点的一般原则,T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)317将它们转移到特定的域(管理窗口管理器的窗口堆栈,或者提供一个可用的界面来编辑大量相关的项目,并可以选择改变主意)。我们的工作(以及许多相关工作)的基本基础之一是单孔上下文。这些已经在[10]中讨论过,并提供了离散数学和数据结构之间的有趣关系。事实上,正是由于这个链接,我们知道我们可以使用模板Haskell脚本自动生成简单数据结构的上下文在文献中存在现有的可重用的、基于zip的库。在[3]中,作者考虑了一种数据结构,它对被遍历的类型是参数化的,并且需要更少的样板来实现。然而,他们的库没有考虑遍历异构数据类型,似乎没有一个简洁的扩展工作,将允许这样的遍历。在[2]中,作者提出了一个优雅的基于GADT的zipper库,它能够遍历异构数据类型,并且不需要使用样板文件。然而,我们认为,如果不编写一些额外的样板文件,它就不是一个实际有用的库;实现需要在所有使用站点上提供大量的类型信息,以允许向上/向左/向右移动,向下移动需要移动到的精确类型可用。在一个交互式地允许用户更新光标位置的应用程序通过我们的库,我们提供了类型特定的移动,但也提供了恢复通用移动所需的额外样板,可以在没有任何额外类型约束的情况下移动光标。在[6]中探索了游标库的另一种方法这里,zippers库由遍历函数参数化,并使用分隔的延续在树中移动。作者还展示了如何支持静态已知数量的子光标,允许像我们的路由/书签功能。然而,它们是在文件系统的上下文中工作的,并且不需要考虑它们所呈现的接口中的词汇绑定信息毫不奇怪,我们总是可以向我们的库添加更多功能到目前为止,我们也只研究了简单语言的Language实例生成,我们还没有考虑本身由类型参数化的语言的游标,或者其中包含GADT的语言,这两种语言都可能对自动生成其Language实例提出有趣的挑战。此外,zipper数据结构最初是围绕需要执行本地更新和编辑而不一定是全局遍历的想法设计的;虽然我们通过论证在编辑器上下文中许多本地编辑和更改可能在全局渲染之间发生来证明这一点;我们应该针对一些替代方案对我们的全局遍历执行一些性能和复杂性分析。还有其他一些问题;我们正在使用GHC的一些实验特性(例如,类型族),这些尚未完全实现-当一个完整的18T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)3实现发布后,我们将能够整理一些自动生成的实例。此外,Template Haskell不支持GADT或类型族实例的生成,因此我们的生成脚本将源代码输出到新文件中进行编译;这是一个丑陋的间接步骤,我们希望在未来避免。CLASE是从实现结构化编辑器的经验中产生的。我们现在想将CLASE重新引入到我们的结构化编辑器中,并希望在这样做的过程中能够找到其他有用的遍历和功能,我们可以概括出这些功能在更一般的设置中可能有用。我们已经根据Huet的原始论文中的思想概述了一个游标库,但是使用GADT来允许在异构数据类型之间进行导航。我们相信跨数据类型的zippers是对原始zippers的有 用 扩 展 。 在 这 些 异 构 数 据 类 型 之 间 提 供 通 用 的moveUp/moveDown/moveLeft/moveRight API是主要的困难。使用CLASE可以直接呈现光标和编码书签.所呈现的代码被分成三个部分,用户提供的部分在任何时候都没有要求用户自己执行任何样板代码。确认我们要感谢在Anglo Haskell和Haskell研讨会上对工具演示和有关这项工作的讨论发表评论的许多人。也非常感谢帝国的Slurp研究小组,感谢他们提出的好主意和有用的方法来展示我们的工作。引用[1] Huet,G. 拉链。 Journal of Functional Programming,7(5):549-554,1997[2] 亚当斯,M。功能珍珠:废弃你的拉链。未发表,2007年[3] 欣策河Jeuring,J.功能珍珠:编织J。Functional Programming,11(6):681-689,November2001.[4] 约热湾zipedit库,2008年,http://byorgey.wordpress.com/2008/06/21/zipedit/[5] Stewart,D.Roll Your Own Window Manager:Tracking Focus with a Zipper(Online),2007,http://cgi.cse.unsw.edu.au/~dons/blog/2007/05/17[6] 基谢廖夫岛工具演示:基于zipper的文件/操作系统。Haskell工作室。ACM出版社,2005年[7] Sulzmann ,M.和 Chakravarty,M.M. T. 和Jones, S.P. Donnelly , K.System F with Type EqualityCoercions,第三届ACM SIGPLAN语言设计与实现类型研讨会(TLDI[8] Allwood,T. Clase library download and screenshots,(Online),2008,http:www.zonetora.co.uk/clase/.[9] de Bruijn,N. G.λ演算符号与无名假人。一种用于自动公式操作的工具,应用于Church-Rosser定理,在Indagationes Mathematicae(34)381T.O.R. Allwood,S.Eisenbach/Electronic Notes in Theoretical Computer Science 253(2010)319[10] 麦克布莱德角正则型的导数是其单洞上下文的类型,未出版,2001年,http://strictlypositive.org/diff.pdf[11] 琼斯,S。P和Vytiniotis。D和Weirich S,和Washburn G.基于简单统一的类型推断性别与发展贸易,载于ICFP,2006年[12] Chakravarty , M. M. T. Keller , G. 和 Jones , S. 和 Marlow , S. 与 类 相 关 的 类 型 , 在POPLhttp://www.cse.unsw.edu.au/~chak/papers/assoc.ps.gz
下载后可阅读完整内容,剩余1页未读,立即下载
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 构建智慧路灯大数据平台:物联网与节能解决方案
- 智慧开发区建设:探索创新解决方案
- SQL查询实践:员工、商品与销售数据分析
- 2022智慧酒店解决方案:提升服务效率与体验
- 2022年智慧景区信息化整体解决方案:打造数字化旅游新时代
- 2022智慧景区建设:大数据驱动的5A级管理与服务升级
- 2022智慧教育综合方案:迈向2.0时代的创新路径与实施策略
- 2022智慧教育:构建区域教育云,赋能学习新时代
- 2022智慧教室解决方案:融合技术提升教学新时代
- 构建智慧机场:2022年全面信息化解决方案
- 2022智慧机场建设:大数据与物联网引领的生态转型与客户体验升级
- 智慧机场2022安防解决方案:打造高效指挥与全面监控系统
- 2022智慧化工园区一体化管理与运营解决方案
- 2022智慧河长管理系统:科技助力水环境治理
- 伪随机相位编码雷达仿真及FFT增益分析
- 2022智慧管廊建设:工业化与智能化解决方案
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)