没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记124(2005)101-112www.elsevier.com/locate/entcsHaskell中的可编程重写策略- 白皮书-Ra lfLammel1,21阿姆斯特丹自由大学2Centrum voor Wiskunde en Informatica,阿姆斯特丹摘要可编程重写策略为在语法驱动(或模式驱动)工具中实现遍历功能提供了有价值的工具。工作中的Haskell程序员可以通过两个类似的选项访问可编程重写策略:(i)用于泛型函数式编程和语言处理的Strafunski 基本的重写步骤被编码为数据库上的单态函数。重写策略是由适当的基本策略组合子组成的多态函数。我们将简要回顾Haskell中的可编程重写策略。我们将讨论以下问题:• Haskellish策略的优点是什么• 战略规划和一般规划之间的关系是什么?• 今后在职能战略方面的工作面临哪些挑战?保留字:重写startegies,编程语言,Haskell,函数式编程1战略方案拟订我们对“策略”一词的使用源于对可编程重写策略的研究[ 3 0,40,3 8 ]。战略规划*本白皮书作为第四届重写和编程中的简化策略国际研讨会(WRS 2004)的邀请立场文件,2004年6月2日,Aachen,Germany。这篇文章发表于WRS200第四版“当今编程语言中的结构“。1571-0661 © 2005由Elsevier B. V.出版,CC BY-NC-ND许可下开放获取。doi:10.1016/j.entcs.2004.11.021102R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101语法学家可以将基本的重写步骤与遍历和求值的总体方案这些方案本身是可编程的!有一层遍历原语,便于定义遍历的任何递归模式。还有一些基本的组合子,它们可以控制计算的步骤顺序、要做的选择、要计算的定点等。[ 24 ]中对我们所说的“战略规划”进行了进一步的阐述相关形式的可编程策略渗透到计算机科学中。例如,没有任何遍历控制的求值策略在重写[7,4]中是有用的在定理证明中,人们使用一种策略作为证明策略和战术[33]。在并行函数式编程中,人们使用一种策略来合成并行程序[36]。2斯特拉方斯基的功能策略Strafunski项目[1,27,19,25,26,28]体现了函数式编程的可编程重写策略,即Haskell。策略本质上是数据集(或“术语类型”)上的多态函数。基本的重写步骤很容易被指定为数据库上的单态函数。例如,以下重写步骤对算术表达式的某种常数消除进行编码:const_elim:: Expr ->Maybe Exprconst_elim((Const 0)const_elim_=无在具体的语法中,没有Haskellish噪音,这读作在示例中,我们将重写步骤的结果包装在Maybe monad中,这允许我们观察重写步骤的成功与失败。我们可以在重写步骤和策略中使用堆叠的monad(而不仅仅是Maybe)。这允许我们处理状态、环境、非确定性和回溯。在Strafunski中,有两种(一元)类型的策略:• TP-类型保持策略:域和共域重合。• TU-类型统一策略:所有数据集都映射到一个结果类型。Strafunski• idTP-标识函数。• failTP-总是失败的策略。• adjacent TP-更新策略中的一种 类型。• seqTP-顺序组合。• choiceTP-左偏选择。R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101103• allTP-对所有直接子项应用策略。• oneTP-将策略应用于一个直接子项。• 类似的运算符用于TU。重写步骤可以使用adaptTP 组合器转换为功能策略策略(idTP 策略(failTP我们现在可以定义各种可重用的求值和遍历方案,例如:--策略repeatTP ::MonadPlusm=> TP m->TPm的详尽应用repeatTPs= (s--自上而下顺序的完整类型保持遍历full_tdTP::Monad m => TP m-> TPmfull_tdTP s=s--类型保持遍历在成功分支停止stop_tdTP ::MonadPlusm => TP m-> TP mstop_tdTPs= s--自下而上顺序的一次命中类型保留遍历once_buTP::MonadPlusm => TP m-> TPmonce_buTPs=(oneTP(once_buTPs))《战略规划的本质》的本质作为一个说明性用例,once_buTP(failTP当给定一个项时,尝试一个单一的常数消除。彻底地应用这一策略(参见评估策略重复TP),相当于(天真)最内在的标准化此用例展示了战略规划的总体要旨:单独的问题特定重写步骤(即,const_elim)从用于遍历和评估的总体的、可能可重用的方案(即,once_buTP)。这两个部分都放在一起,只是参数传递,或功能组合。用于遍历和评估的方案借助于一层遍历原语(即,allTP和oneTP)。3Haskellish策略的优点是什么?应用设置Haskellish策略诞生于应用编程环境中。也就是说,我们设计它们是为了使函数式编程适合于程序分析和转换的实现--如果相关的话104R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101在语言实现、软件逆向工程、再工程等方面。例如,Strafunski此外,函数策略在可以容纳的递归方案方面是通用的-与仅使用一般化折叠的编程相比[31]。此外,功能策略可以方便地定制,而定制在其他设置中被认为是一个从属问题,这使得完全通用的功能,如通用映射[14,13]。自定义对于策略编程至关重要,因为遍历策略定期涉及类型特定的情况。职能战略以各种方式使用,例如:• 最先进的Haskell重构工具[29]。• Fortran语言扩展[9]。• Java重构[27](准确地说是Java的一个子集)。• Java的简单软件度量[28]。• Cobol的逆向工程[28](调用图提取)。• 一个语言参数重构的框架[20]。语言经济性函数式策略在Haskell中很容易得到支持。有不同的实施模型[27,19,26]。不需要适当的语言扩展。对于某些位,代码需要根据用户定义的数据类型进行派生,但是为了方便程序员,这是自动化的。Haskell提供了大多数策略性习惯用法。最值得注意的是,重写步骤只是由模式匹配定义的函数。此外,monads [41]很好地适应了在战略规划中遇到的效果。Maybemonad模型描述了失败的可能性。列表monad(和朋友)用于处理非确定性和回溯,类似于状态和环境monad。Haskell在为编程领域实现组合子库方面有着很好的记录用于解析、漂亮打印、XML处理、图形用户界面和数据结构。StrafunskiHaskell中的策略编程意味着调试、编译、类型检查、类型推断等。免费的强类型的第一类策略策略组合子是高阶函数,它带有有趣的类型。所以,Haskell再次是正确的选择。第一,战略组合的类型,R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101105如果它是类型保持(其次,在类型中选择Monad实例,指出包括失败可能性在内的影响。第三,类型指示除了执行遍历的术语之外还需要传递的可能参数。虽然在推理系统中,Rexgo基本上是无类型的(但它可以是有类型的[21]),但Haskellish策略在多态性和高阶函数的所有美感中都是有类型的。这在“多态交响乐的草图”[ 19 ]中得到了限制我们采用[20]中的一个例子来说明类型化高阶策略的优点.下面的函数签名为语言参数化程序转换键入策略提取也就是说,该策略对任何抽象形式的提取重构进行建模-无论是方法声明,函数声明还是其他形式:extract:: Abstraction abstrname tpe apply=> TU[(name,tpe)] Identity--识别声明->TU[name]身份--使用参考资料->(apply -> Maybe apply)--识别聚焦片段->([abstr]->[abstr])--为新抽象标记->([摘要]->可能[摘要])--删除主机的->([(name,tpe)] -> apply -> Bool)--片段的附带条件->name--新抽象的名称-> prog--输入程序-> Maybe prog--输出程序上面的Haskell类型清楚地标识了语法类别prog(程序)、abstr(抽象形式)、name(参数和抽象的名称)和tpe(参数类型)的4个类型参数,它们具有关系抽象,以便使函数提取关于相关抽象形式的参数。使用无类型的提取超出了Haskell程序员的想象。如何理解和正确使用一个有8个值参数的无类型函数;高阶类型的8个参数中的6个;策略多态类型的6个参数中的2个?4Aren’t strategies just about generic在Strafunski中,策略类型是不透明的。Strafunski这允许不同的战略模型。一些模型已在文献中描述[27,19,26]。一些战略性的改进可以通过新的模型来实现,而不需要改变Strafunski这种不透明的状态也鼓励了无点风格(或组合子风格)的战略编程。我们可以清楚地看到106R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101StrafunskiapplyTP::(Monad m,Termt)=> TP m->t-> m tapplyTPst=... --省略了不透明的然而,策略类型并不是天生不透明的,在泛型编程的“废弃你的样板”方法中在这种方法中,通用遍历方案和所有只是直接多态函数,可能是秩2类型(如Haskell的GHC实现所支持的,但也在其他地方)。“ScrapYour Boilerplate“方法基于两个Haskell类Typeable和Data(前者是后者的超类),(TheHaskell的GHC实现会根据用户定义的数据类型自动派生这些类的实例Strafunski然后,策略类型变得透明,简洁和通用:type GenericM m = forall a. 数据a => a -> m a--对应于TP m类型GenericT= forall a。Data a => a-> a--transformations typeGenericQr = forall a. 数据a=>a->r--查询在Strafunski中,我们不喜欢像GenericT这样的变体,因为这意味着各种不透明类型的组合子会激增。为了说明这些forall类型的用法,我们重新构造遍历方案stop_tdTP:stop_tdTP:: GenericM Maybe -> GenericTstop_tdTPs x = cases x ofNothing -> gmapT(stop_tdTPs)xJustx我们使用组合子gmapT::GenericT-> GenericT,这是allTP的非一元变体[22]。stop_tdTP的类型表明这个组合器接受一个多态函数并返回一个多态函数。为了可读性,我们使用类型别名;我们也可以内联forall类型。作为一个多功能的练习,我们重新构造了一个类型更特殊的方案stop_tdTP。最初的方案涉及不透明类型TP m,其中m可以稍后被安装到 MonadPlus 的 任 何 实 例 。 重 建 的 方 案 将 参 数 类 型 的 单 子 固 定 为Maybe,这允许我们保证组合策略的成功(参见。非一元结果类型GenericT)。一旦我们习惯了构造泛型函数类型,我们就不会将自己局限于策略类型。也就是说,虽然策略是datasets上的一元多态函数,但还有其他感兴趣的多态类型计划。泛型函数不需要是一元的,R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101107在参数位置多态。 例如:类型GenericEq= for a b.(Dataa,Data b)=>a -> b-> Bool--泛型相等typeGenericB=forall a. 数据a => a--构建一个术语;没有遍历!typeGenericR m =for all a. 数据a=>ma --使用单子读取一个项因此,虽然Strafunski方法强调一元项遍历,但泛型函数式编程的“Scrap Your Boilerplate“方法允许我们抽象的不仅仅是我们可以抽象多参数遍历,术语生成,序列化,反序列化,压缩等[23]。特别是术语遍历和术语构建之间的对应关系是一种二元性,这是一段时间以前由squiggolists发现的:给定一个规则的数据类型(如列表),甚至可能是任何数据类型,人们可以折叠该类型的数据(其他泛型编程方法也可以满足这种普遍性。例如,像PolyP [14]或Generic Haskell [12,6]这样的泛型编程扩展采用了强大的技术来对要消费或生产的数据的类型结构进行结构归纳在这种情况下,• 这种方法与普通的Haskell编程很好地融合在一起。• 该方法是轻量级的。它基于两个简单的Haskell类型类。• 该方法不需要任何编译时代码专门化。• 泛型函数在Haskell数据库上立即运行。• 泛型函数是一等公民:遍历模式是高阶的。• 通用函数很容易通过(名义上的)类型大小写进行定制。5接下来该怎么办?战略规划是一个年轻的研究领域。一些挑战正在等待。下面的列表偏向于函数式策略,与当前的Strafunski和分析机会功能策略师可能希望利用分析来改善其策略的静态保证或运行时性能。以下是一些典型的例子终止策略遍历方案类似于递归方案:它们意味着自由旋转递归程序的有纪律的替代品-108R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101明.尽管如此,策略的多样性使得编码不同的策略仍然很容易。例如,(repeatTP idTP)将发散。使用repeatTP的定点迭代的隐含使用模式是参数策略最终应该失败。愚蠢就像在面向对象编程中有“愚蠢的强制转换”一样(即, 不可能成功的类型转换),所以在策略编程中存在“愚蠢的策略”。例如,策略(完整tdTP(failTP‘adhocTP‘捷径在策略的类型特定的情况下,捷径遍历导致更高效的遍历通常是可行的。例如,如果很明显f的域的子项在静态类型信息的基础对于这种无望的分支,该策略可以是idTP的捷径。可组合性策略链需要合作,因为链中的给定策略应该被链中的早期元素启用,或者至少不被禁用。(One也许可以称之为愚蠢的高级形式,所以它并不愚蠢!)启用和禁用可以取消-理解为战略的前置和后置条件,在这种情况下,有关程序转换的工作可能会有用[18,34]。表达机会功能策略师甚至可能要求额外的表达能力,在极端情况下,这或者,额外的策略表达能力也可以通过更开放的Haskell系统,或者通过预处理,或者通过适当的组合子库来适应以下是一些主要的例子潜在的需要是指定类型来声明、检查和推断成功行为、决定论和某些形式的前置和后置条件。此外,涉及战略的影响(如失败,状态,环境)更方便地与输出类型的系统per-silos [10]一起使用-而不是显式monad transformers。一个具有非常开放类型系统的Haskell 20XX在这里会很有用对象语法策略编程的主要应用领域是程序分析和转换。用抽象语法对重写步骤进行编码,对于现实世界的编程来说相对不方便。R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101109语言。Haskell可以支持具体的语法,就像ASF+SDF [17,5]这样的重写技术已经做了很长时间。Replego已经配备了具体对象语法[39];Haskell必须迎头赶上。许多程序分析和转换都倾向于使用基于图的中间表示。Haskell的惰性允许循环数据结构。节点身份必须仔细“管理”。在Haskell中,构造和转换多类图是很困难的我们正处在一种有类型的方法,保留了模式匹配和构建的便利性,并为我们提供了破坏性更新的错觉属性语法策略和属性语法是互补的,因为前者更具操作性,而后者更具声明性。此外,前者强调遍历,而后者强调属性依赖性。关于可能的战略结合的研究而属性语法则提供了有趣的见解。与策略类似,属性语法也方便地嵌入到Haskell中[8]。约束编程另一个未被探索的世界组合是可编程策略和约束编程的集成,或者剩余和缩小-如Curry这样的混合语言中可用[11]。 约束可以提供一种通用的方法来制定战略少一些操作性,多一些宣言性。制约因素还可以提供缩小战略搜索空间的手段。除了基于语法的语言处理之外,策略被认为对XML文档处理也很有用。用于XML处理的函数组合子库确实存在[42],但它们缺乏函数策略的类型化强度。应该可以使用策略作为一种手段,提供一种类似XPath的语言来控制完全类型化的XML转换的假象。策略挖掘重构为策略传统Haskell程序的模块化和简洁性可以从编程的战略风格中受益这就需要“战略挖掘”。存在恢复递归方案的相关工作,如遗留代码中的折叠[37]。在开发和增强现有的Haskell程序时,必须通过重构的方式安装或改进策略风格事实上,这是一种“重构到模式”的形式 在这两种情况下,纠缠的遍历代码变成了战略组织的遍历代码。110R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)1016结束语我们简要回顾了基于Haskell的可编程重写策略支持。我们还简要地讨论了重写策略和泛型编程之间的联系最后,我们列出了未来工作的挑战Haskellish重写策略。请继续关注[1,2]。确认Strafunski项目[1,27,19,25,26,28]是与Joost Visser的联合工作。“废弃你的样板“方法[2,22,23]是与西蒙·佩顿·琼斯的引用[1] Strafunski 网 站 : 实 例 、 下 载 、 可 浏 览 图 书 馆 、 论 文 、 背 景 , 2000- 2004 年 。http://www.cs.vu.nl/Strafunski/。[2] “ 废 弃 你 的 样 板 文 件 “ 网 站 : 实 例 、 可 浏 览 图 书 馆 、 论 文 、 背 景 , 2003- 2004 年http://www.cs.vu.nl/boilerplate/。[3] L.奥古斯丁排序态射。在南达科他州。Swierstra,P.R. Henriques和J.N. Oliveira,editors,Advanced Functional Programming , 3rd International School , Braga , Portugal ,September 12-19 , 1998 , Revised Lectures , volume 1608 ofLNCS , pages 1Springer-Verlag,1999.[4] P. 博罗万斯基角Kirchner和H.基什内尔通过重写来控制重写在Meseguer [32]。[5] M.G.J. van den Brand,Arie van Deursen,J. Heering,H.A. de Jong,M. de Jonge,T. 凯珀斯,克林特湖Moonen,P.A.放大图片作者:J. Visser和J. Visser。ASF+SDF元环境:一个基于语法的语言开发环境。在R. Wilhelm,编辑,Proc. Per Construction(CC 2001),LNCS第2027卷,第365-370页。Springer-Verlag,2001.[6] D. Clarke,J. Je u r ing,and dA. Léoh. 2002年,通用电气公司出版了《通用电气公司指南》。Version1.23-绿柱石释放。[7] M. Clavel,S. Eker,P. Lincoln,and J. Meseguer. Maude的原则 在Meseguer [32]。[8] O. de Moor , K. Backhouse 和 S.D. 斯 维 尔 斯 特 拉 第 一 类 属 性 语 法 。Informatica : AnInternational Journal of Computing and Informatics,24(2):329-341,June 2000.专题:属性文法及其应用。[9] M. Erwig和Z. Fu.参数化Fortran -一个用于定制通用Fortran扩展的程序生成器。芽孢杆菌中Jayaraman , editor , Proceedings Practical Aspects of Declarative Languages ( PADL2004),LNCS,Dallas,Texas,USA,2004.史普林格出版社地出现。[10] A.菲林斯基表示分层单子。在 Proceedings 26 th ACM SIGPLAN-SIGACT Symposium onPrinciples of Programming Languages,第175Press.[11] M. 哈纳斯Curry-A Truly Integrated Functional Logic Language,2004。http://www.informatik.uni-kiel.de/~mh/curry/网站。R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101111[12] R. 欣兹Haskell的泛型编程扩展第三届Haskell研讨会论文集,法国巴黎,1999年。乌得勒支大学技术报告[13] R.欣兹泛型函数式编程的新方法。在Proceedings 27 th ACM SIGPLAN-SIGACT Symposiumon Principles of Programming Languages(POPL北京:人民出版社,2000年。[14] P. Jansson 和 J. 开玩笑。息肉 - 一 多型 编程 语言 扩展名.在Proceedings 24 thACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages(POPLPress.[15] P. Jansson和J. Jeuring。一个基于术语的多型编程框架,并应用于重写。在j.Jeuring,editor,Proceedings Workshop on Generic Programming ( WGP 2000 ) , Ponte de Lima ,Portugal,Technical report ICS Utrecht University,UU-CS-2000- 19,2000.[16] J. Kierievsky 重构为模式。艾迪森·韦斯利2004年地出现。[17] P. Klint用于生成编程环境的元环境。ACM软件工程与方法学报,2(2):176[18] G. 我的名字是L和H。 Koch。 Refacing的结构组合。 在R。Lüammel,编辑,计算机程序设计科学;程序转换特刊。Elsevier Science,2004年。地出现。[19] R. Léamm el.这是一种多形性淋巴瘤的症状。InB.Gr am lichandS. Lucas,编者,Proceedings 2nd International Workshop on Reduction Strategies in Rewriting andProgramming(WRS 2002),ENTCS第70卷。Elsevier Science,2002年。21页。[20] R. 拉 梅 尔两个 GenericRefactoringg.在 第 3 届 ACMSIGPLANWorkshopon Rule-BasedProgramming RULE'02上,美国宾夕法尼亚州匹兹堡,2002年10月Press. 14页。[21] R. 拉梅尔 类型GenericTravalWithTermRe writingStrategies. 《逻辑与代数程序设计》,54:1-64,2003年也可作为arXiv技术报告cs.PL/0205018获得。[22] R. Léamm elandS. 我是约翰。SCRAPYORBOILER PLATApr APCALDESGNPA T E R G PATER GN P A T E R G PAT G N A T A TACM SIGPLAN Notices,38(3):26-37,March2003. ACM SIGPLAN语言设计和实现中的类型研讨会(TLDI 2003)。[23] R. LéammelanddS. 给约翰。 螺旋桨或电子注油器板:重新装配、重新定位和通用铸件。第九届ACM SIGPLAN函数式编程国际会议(ICFP-04),2004年。12页;出现。[24] R.Lüammel , E.维 塞 尔 和 J 。 维 瑟 。 Strategi c Programmingg.Draft;Availableathttp://www.cwi.nl/~ralf,2002-2004.[25] R. 我叫 L 和J 。Visser.设计用 于 FUNCTIONSTRAGC 编程的 P A TT E RNS 。在Proceedings 3rd ACM SIGPLAN Workshop on Rule-Based Programming RULE'02中,匹兹堡,美国,2002年10月Press. 14页。[26] R. L ?amm elandJ. V isser.Str a t egicpolym or ph ismrquire esjusttwocomb i n at or s !TechnicalReport cs.PL/0212048,arXiv,2002年12月。[27] R. L?amm elandJ. V isser. 类型Comb i n at o r Gener icTraver sal. InS. KrishnamurrthianddC.R. Ramakrishnan,编者,Proceedings Practical Aspects of Declarative Languages(PADL2002),LNCS第2257卷,第137-154页,Portland,OR,USA,2002年1月。施普林格出版社。[28] R. 我叫L和J。 Visser. AStr afunskiAp p plicationLetter. 在V。 达哈和普。Wadler,editor,Proceedings Practical Aspects of Declarative Languages ( PADL 2003 ) , volume 2562ofLNCS,pages 357史普林格出版社[29] H. Li,C. Reinke和S.汤普森工具支持重构功能程序。在Proceedings ACM SIGPLAN Workshopon Haskell,第27Press.112R. Lämmel/Electronic Notes in Theoretical Computer Science 124(2005)101[30] B. Luttik和E.维瑟重写策略的具体化。在MPA Sellink,编辑,第二届国际研讨会的理论和实践的代数规范(ASF+SDFSpringer-Verlag,1997年11月。[31] E. Meijer,M. Fokkinga和R.帕特森用香蕉、透镜、信封和铁丝网进行函数式编程。在J. Hughes编辑的Proceedings 5th ACM Conf. on Functional Programming Languages and ComputerArchitecture中,FPCASpringer-Verlag,Cambridge,MA,USA,1991年8月。[32] J. Meseguer,编辑。Proceedings 1st International Workshop on Rewriting Logic and itsApplications,RWLW[33] L.C.保尔森重写的高阶实现。Science of Computer Programming,3(2):119[34] G.锡坦帕兰岛de Moor和K.F.拉森增量执行转换规范。在Proceedings 31 st ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages(POPL 2004),第26-38页,威尼斯,意大利,2004年。Press.[35] S.D. Swierstra , P.R.A. Alcocer 和 J. Saraiva 。 设 计 和 实 现 组 合 子 语 言 。 在 南 达 科 他 州 。Swierstra,P.R. Henriques和J.N. Oliveira,editors,Advanced Functional Programming,3rd International School , Braga , Portugal , September 12-19 , 1998 , RevisedLectures,volume 1608 ofLNCS,pages 150-206. Springer-Verlag,1999.[36] P.W. Trinder,K.哈蒙德,H.- W. Loidl和S.佩顿·琼斯。算法+策略=策略主义。Journal ofFunctional Programming,8(1):23[37] G. Villavicencio和J.N.奥利维拉 代码切片支持的逆向程序计算。Aiken,E. Burd和R. Koschke,编 辑 , Proceedings Working Conference on Reverse Engineering ( WCRE 2001 ) , 第35IEEE计算机协会出版社,2001年10月[38] E.维瑟一种基于重写策略的程序转换语言。系统描述:以. Middeldorp,编辑,ProceedingsRewriting Techniques and Applications(RTASpringer-Verlag,2001年5月。[39] E. 维瑟使用具体对象的元编程In D.巴托里角康塞尔,以及W. Taha编辑,生成编程和组件工程(GPCE史普林格出版社[40] E. Visser,Z. Benaissa和A.托马赫使用重写策略构建程序优化器。在Proceedings ACM SIGPLANInternational Conference on Functional Programming(ICFPPress.[41] P. Wadler函数式编程的本质。在ACM,编辑,会议记录的第十九届年度ACM SIGPLAN-SIGACT研讨会上编程语言的原则,阿尔伯克基,新墨西哥州,1992年1月19日ACM Press,1992.[42] M华莱士和C朗西曼。Haskell和XML:泛型组合符或基于类型的翻译。在Proceedings ACMSIGPLAN International Conference on Functional Programming(ICFPPress.
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功