Arxiv:1908.10926V1 [Cs.PL] 28 Aug 2019 Nenlprso Aasrcue Uhapitri Sal Alda Pointe Called Usually a Is Keep Pointer to a Ability Such Structure
Total Page:16
File Type:pdf, Size:1020Kb
Load more
Recommended publications
-
Generic Haskell: Applications
Generic Haskell: applications Ralf Hinze1 and Johan Jeuring2,3 1 Institut f¨urInformatik III, Universit¨atBonn R¨omerstraße 164, 53117 Bonn, Germany [email protected] http://www.informatik.uni-bonn.de/~ralf/ 2 Institute of Information and Computing Sciences, Utrecht University P.O.Box 80.089, 3508 TB Utrecht, The Netherlands [email protected] http://www.cs.uu.nl/~johanj/ 3 Open University, Heerlen, The Netherlands Abstract. 1 Generic Haskell is an extension of Haskell that supports the construc- tion of generic programs. This article describes generic programming in practice. It discusses three advanced generic programming applications: generic dictionaries, compressing XML documents, and the zipper. When describing and implementing these examples, we will encounter some advanced features of Generic Haskell, such as type-indexed data types, dependencies between and generic abstractions of generic functions, ad- justing a generic function using a default case, and generic functions with a special case for a particular constructor. 1 Introduction A polytypic (or generic, type-indexed) function is a function that can be instan- tiated on many data types to obtain data type specific functionality. Examples of polytypic functions are the functions that can be derived in Haskell [50], such as show, read, and ‘ ’. In [23] we have introduced type-indexed functions, and we have shown how to implement them in Generic Haskell [7]. For an older introduction to generic programming, see Backhouse et al [4]. Why is generic programming important? Generic programming makes pro- grams easier to write: – Programs that could only be written in an untyped style can now be written in a language with types. -
Generic Programming with Dependent Types
Generic Programming with Dependent Types Thorsten Altenkirch, Conor McBride and Peter Morris School of Computer Science and Information Technology University of Nottingham 1 Introduction In these lecture notes we give an overview of recent research on the relationship and interaction between two novel ideas in (functional) programming: Generic programming Generic programming [15, 21] allows programmers to explain how a single algorithm can be instantiated for a variety of datatypes, by computation over each datatype’s structure. Dependent types Dependent types [28, 37] are types containing data which enable the programmer to express properties of data concisely, covering the whole spectrum from conventional uses of types to types-as-specifications and programs-as-proofs. Our central thesis can be summarized by saying that dependent types provide a convenient basis for generic programming by using universes. A universe is basically a type U : ⋆ which contains names for types and a dependent type, or family, El : U → ⋆ which assigns to every name a : U the type of its elements El a : ⋆—we call this the extension of the name a. Historically, universes have been already used by Type Theory to capture the predicative hierarchy of types, first introduced by Russell to prevent set-theoretic paradoxes: ⋆0 : ⋆1 : ⋆2 : ...⋆i : ⋆i+1 : . If we want to avoid chains of : we can represent this hierarchy as: U i : ⋆ El i : U i → ⋆ ui : U i+1 Here ⋆ plays the role of a superuniverse in which all universes can be embedded, while U i is the type of (names of) types at level i. The operation El i assigns to any name of a type at level i the type of its elements. -
Exploring the Regular Tree Types
Exploring the Regular Tree Types Peter Morris, Thorsten Altenkirch and Conor McBride School of Computer Science and Information Technology University of Nottingham Abstract. In this paper we use the Epigram language to define the universe of regular tree types—closed under empty, unit, sum, product and least fixpoint. We then present a generic decision procedure for Epi- gram’s in-built equality at each type, taking a complementary approach to that of Benke, Dybjer and Jansson [7]. We also give a generic defini- tion of map, taking our inspiration from Jansson and Jeuring [21]. Fi- nally, we equip the regular universe with the partial derivative which can be interpreted functionally as Huet’s notion of ‘zipper’, as suggested by McBride in [27] and implemented (without the fixpoint case) in Generic Haskell by Hinze, Jeuring and L¨oh[18]. We aim to show through these examples that generic programming can be ordinary programming in a dependently typed language. 1 Introduction This paper is about generic programming [6] in the dependently typed functional language Epigram [29, 30]. We construct the universe of regular tree types—the datatypes closed under empty, unit, sum, product and least fixpoint—by giving a de Bruijn-style syntax [14] to its types and presenting the elements of those types as an inductive family [16]. The regular tree types form quite a small universe compared to others we might imagine [4, 7], but it is a universe very rich in structure. We realise some of that structure by writing programs: we show that Epigram’s standard equality is decidable for every regular tree type; we equip every regular tree type con- structor with its associated notion of functorial ‘map’; we construct the formal derivative of each type expression, including those with fixpoints, and extract the corresponding notion of one-hole context or ‘zipper’ [20]. -
Technical Report Handling Recursion in Generic Programming Using Closed Type Families
Technical Report Handling Recursion in Generic Programming Using Closed Type Families Anna Bolotina1 and Artem Pelenitsyn2 1 Southern Federal University, Rostov-on-Don, Russia [email protected] 2 Czech Technical University in Prague, Prague, Czech Republic [email protected] Abstract. Many of the extensively used libraries for datatype-generic programming offer a fixed-point view on datatypes to express their re- cursive structure. However, some approaches, based on sums of prod- ucts, do not use a fixed point. They allow for generic functions that do not require to look at the recursive knots in a datatype representation, but raise issues otherwise. A known and unwelcome solution is the use of overlapping instances. We present an alternative approach that uses closed type families to eliminate the need of overlap for handling recur- sion in datatypes. Moreover, we show that our idiom allows for families of mutually recursive datatypes. Keywords: Datatype-generic programming · Sums of products · Recur- sion · Overlapping instances · Closed type families · Zipper · Mutually recursive datatypes · Haskell. 1 Introduction A classical way to generically express a datatype is to represent its construc- tors as the chains of nested binary sums, and turn constructor arguments into the chains of nested binary products [24, 3, 14]. De Vries and L¨oh[5] describe a different sum-of-products approach to representing data using n-ary sums and products that are both lists of types; a sum of products is thus a list of lists of types. They call their view SOP which stands for a \sum of products". It is implemented in the generics-sop [7] library and is based on several relatively recent extensions to the Haskell type system, such as data kinds, kind polymor- phism [27] and constraint kinds. -
Zipper-Based File/OS1
Zipper-based File/OS1 An extra-program demo at the Haskell Workshop 2005 We present a file server/OS where threading and exceptions are all realized via delimited continuations. There are no unsafe operations, no GHC let alone Unix threads, no concurrency problems. Our threads cannot even do IO and cannot mutate any global state — and the type system sees to it. 1I am very grateful to the Program Committee of the Haskell Workshop 2005 and its chair, Daan Leijen, for the opportunity to present ZipperFS as an extra talk. Many thanks to Chung-chieh Shan for discussions and invaluable help with the presentation. 1 Getting the first impression I Load ZFS.hs into GHCi I Start up the system: main at the GHCi prompt I From some terminal: telnet localhost 1503 I ls I cat fl1 I cd d1 I ls I ls d11 I ls d11/d111 That was an empty directory. This all looked like UnixFS. However, there are no . and .. I ls ../d2 – another empty dir I cat ../d2/../fl2 Absolute paths work too. 2 Filesystem term type FileName = String type FileCont = String – File content data Term = File FileCont | Folder (Map.Map FileName Term) data NavigateDir = Update Term | DownTo FileName | Up | Next traverse :: Monad m => (Path ! Term ! m NavigateDir) ! Term ! m (Term, UpdateStatus) The ‘file system’ we’ve just seen is a zipper over a recursive data type based on Data.Map of this structure: Term. NavigateDir defines movement from one subterm to another. The user defines a traversal function of this signature. It is a mapM over the term, in an arbitrary monad. -
Species: Making Analytic Functors Practical for Functional Programming
MSFP 2008 Species: making analytic functors practical for functional programming Jacques Carette Gordon Uszkay Computing and Software McMaster University Hamilton, Canada Abstract Inspired by Joyals theory of species, we show how to add new type constructors and constructor combinators to the tool set of functional languages. We show that all the important properties of inductive types lift to this new setting. Species are analytic functors, representing a broader range of structures than regular functors. This includes structures such as bags, cycles and graphs. The theory is greatly inspired by combinatorics rather than type theory: this adds interesting new tools to bear, but also requires more work on our part to show that species form a good foundations for a theory of type constructors. The combinatorial tools provide a calculus for these structures which has strong links with classical analysis, via a functorial interpretation of generating series. Furthermore, we show how generic programming idioms also generalise to this richer setting. Once the theory is understood, various methods of implementation are relatively straightforward. Keywords: functional programming, combinatorial species, datatype generic programming. 1 Introduction In typed functional languages, types are built inductively from base types using a few combinators: disjoint union (tagged sum), product, composition and recursion. Semantically, polynomial functors and (initial) algebras have been found to be the most convenient model. In practice and in theory, these have proven their worth. As is standard in the literature, we will refer to these types (and their constructors) as “polynomial types” (without recursion) and “regular types”. We will borrow from a vast treasure trove of work done in combinatorics and applied category theory, and apply their results to functional programming. -
Combinatorial Species and Labelled Structures
COMBINATORIAL SPECIES AND LABELLED STRUCTURES Brent Abraham Yorgey A DISSERTATION in Computer and Information Sciences Presented to the Faculties of the University of Pennsylvania in Partial Fulfillment of the Requirements for the Degree of Doctor of Philosophy 2014 Supervisor of Dissertation Stephanie Weirich Associate Professor of CIS Graduate Group Chairperson Lyle Ungar Professor of CIS Dissertation Committee Steve Zdancewic (Associate Professor of CIS; Committee Chair) Jacques Carette (Associate Professor of Computer Science, McMaster University) Benjamin Pierce (Professor of CIS) Val Tannen (Professor of CIS) COMBINATORIAL SPECIES AND LABELLED STRUCTURES COPYRIGHT 2014 Brent Abraham Yorgey This work is licensed under a Creative Commons Attribution 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by/4.0/ The complete source code for this document is available from http://github.com/byorgey/thesis ὅς ἐστιn εἰκὼν tοῦ θεοῦ tοῦ ἀοράτou, prwtόtokoc πάσης ktÐsewc, ὅti ἐν aÎtÄ ἐκτίsjh tὰ πάντa ἐν tοῖc οὐρανοῖc kaÈ ἐπὶ t¨c g¨c, tὰ ὁρατὰ kaÈ tὰ ἀόρατa, εἴte θρόnoi εἴte kurιόthtec εἴte ἀρχαὶ εἴte ἐξουσίαι· tὰ πάντa δι’ aÎtοῦ kaÈ eÊc aÎtὸn êktistai& kaÈ aÎtός ἐστιn πρὸ πάντwn kaÈ tὰ πάντa ἐν aÎtÄ sunèsthken, kaÈ aÎtός ἐστιn ἡ κεφαλὴ tοῦ s¸matoc t¨c ἐκ- klhsÐac& ὅς ἐστιn ἀρχή, prwtόtokoc ἐκ tῶν νεκρῶν, ἵna gènhtai ἐν pᾶsin aÎtὸς πρωτεύων, ὅti ἐν aÎtÄ εὐδόκησεν πᾶν tὸ πλήρωμα katoik¨sai kaÈ δι’ aÎtοῦ ἀποκαταλλάξαι tὰ πάντa eÊc aÎtόn, εἰρηνοποιήσας διὰ tοῦ αἵματoc tοῦ stαυροῦ aÎtοῦ, εἴte tὰ ἐπὶ t¨c g¨c εἴte tὰ ἐν toῖc οὐρανοῖc& PROS KOLOSSAEIS 1.15–20 iii Acknowledgments I first thank Stephanie Weirich, who has been a wonderful advisor, despite the fact that we have fairly different interests and different approaches to research.