Warp: a Haskell Web Server

Total Page:16

File Type:pdf, Size:1020Kb

Warp: a Haskell Web Server The Functional Web Warp: A Haskell Web Server Michael Snoyman • Suite Solutions oughly two years ago, I began work on about this runtime is its lightweight threads. As the Yesod Web framework. I originally a result of this feature, Warp simply spawns a R intended FastCGI for my deployment strat- new thread for each incoming connection, bliss- egy, but I also created a simple HTTP server for fully unaware of the gymnastics the runtime is local testing, creatively named SimpleServer. performing under the surface. Because Yesod targets the Web Application Part of this abstraction involves converting Interface (WAI), a standard interface between synchronous Haskell I/O calls into asynchro- Haskell Web servers and Web applications, it nous system calls. Once again, Warp reaps the was easy to switch back ends for testing and benefits by calling simple functions like recv production. and send, while GHC does the hard work. It didn’t take long before I started getting Up through GHC 6.12, this runtime sys- feature requests for SimpleServer: slowly but tem was based on the select system call. This surely, features such as chunked transfer encod- worked well enough for many tasks but didn’t ing and sendfile-based file serving made their scale for Web servers. One big feature of the way in. The tipping point was when Matt Brown GHC 7 release was a new event manager, written of Soft Mechanics made some minor tweaks by Google’s Johan Tibell and Serpentine’s Bryan to SimpleServer and found that it was already O’Sullivan. This new runtime uses different sys- the fastest Web server in Haskell (see Figure 1). tem calls (epoll, kqueue, and so on) depending After that, he and I made some modest improve- on what’s available on the target operating sys- ments and released the code as Warp. tem. Additionally, Tibell and O’Sullivan made Very little code in Warp itself is geared extensive enhancements to the data structures toward speed. For the most part, it simply the manager uses: it now uses a radix trie for builds on the shoulders of giants — by relying storing callbacks and a priority search queue for on underlying libraries that perform extremely timeouts. well, Warp can achieve a lot in fewer than 500 The end result: Haskell programs can easily lines of code. Let’s explore how Warp uses each scale to thousands of simultaneous connections. of these libraries, what makes them so powerful, Programmers can write their code against a very and how they fit together. simple API, spawning new lightweight threads using forkIO and calling blocking functions Glasgow Haskell Compiler inside them. The first library isn’t really a library at all: the Glasgow Haskell Compiler (GHC) is the standard Enumerator Haskell compiler. It has all the optimizations A recent move in the Haskell community you’d expect of an industrial-strength com- has been adopting the enumerator pattern. piler, such as loop unrolling, extensive inlin- This pattern allows for processing streams of ing, unboxing, and fusion. It even lets users data in a deterministic manner. This is espe- specify their own optimizations via rewrite cially important for Web servers, which must rules. In addition, it provides a very sophisti- quickly release scarce resources such as file cated multi threaded runtime. One great thing descriptors. MAY/JUNE 2011 1089-7801/11/$26.00 © 2011 IEEE Published by the IEEE Computer Society 81 IC-15-03-funweb.indd 81 4/6/11 3:52 PM The Functional Web 81,701 body and sent to the application, or will be part of the next request. Enumeratees also play an impor- 64,028 tant role in Warp. They ensure that the application consumes the entire request body before continuing with the next request, and that the application doesn’t consume more 35,272 35,811 bytes than it should for the request body. They also convert the response body from a stream of Builders (dis- 18,654 cussed next) to a stream of bytes with chunked transfer encoding applied. 3,237 3,416 3,417 4,660 Blaze-Builder The simplest way to represent a string in Haskell is as a list of Uni- PHP Snap Node Yesod Warp Goliath Tornado code characters. This has two major Winstone Happstack performance issues: it’s expensive to append data to a list, and the rep- Figure 1. Pong benchmark. Requests/second (higher is better). resentation of the list has a lot of overhead. Historically, two different John Millikin (unaffiliated) wrote and Iteratee: it receives a stream solutions have existed, one solving the enumerator package that WAI of data from an Enumerator and each issue: and Warp use. In this package, the sends a new stream of data to an central datatype is Iteratee. An Iteratee. • Use difference lists instead of Iteratee is a data consumer, receiv- Warp’s entire I/O system is built actual lists during data con- ing chunks of data and performing on top of the Enumerator datatype. struction, and produce only the some action with them. Iteratee is Once Warp establishes a connection final output list at the end. This an instance of Monad, making it easy and starts a new handler thread, it exploits the fact that append- to compose two Iteratees together produces an Enumerator from the ing to a difference list is an O(1) to build up more complicated actions. client socket and pipes that data into operation. (For those not familiar, a Monad an Iteratee. This Iteratee is where • Represent our data using a packed is a container that encapsulates a all request parsing occurs. format such as ByteString or the computation’s side effects. Haskell Enumerator’s built-in chunking newer Text datatype. programmers can easily combine behavior also works perfectly for different monadic values to build up Warp as well. The Enumerator opti- The blaze-html package, by more powerful computations.) mizes the size of its requested buf- Jasper Van der Jeugt of Ghent The flip side ofIteratee is fers, currently set at 4,096 bytes. University and Simon Meier of ETH Enumerator, a data producer. An The consuming Iteratee, on the Zurich, sought to solve both issues Enumerator will feed data into an other hand, has no concept of these during HTML content construction. Iteratee until either the Enumerator chunks’ size. Instead, it simply con- The idea is to work around the has run out of data or the Iteratee sumes as many bytes as it wants. central concept of a Builder, a no longer accepts more. A simple If there isn’t enough buffered con- value that knows how it should fill example of the interaction between tent to complete an operation (for up a memory buffer. Internally, a these two is file input and output: example, the chunk terminated in Builder is a difference list of these enumFile is an Enumerator that reads the middle of an HTTP header), then buffer-filling actions. Combining data from a file and streams it into an control automatically returns to the these two points, we end up with a Iteratee, whereas iterHandle is an Enumerator to provide more output. packed representation of data with Iteratee that consumes a stream of If too much data was provided, the efficient append operations. And, bytes and sends them to a handle. remainder is left in the Enumerator just as important, we’re guaranteed A third datatype, an Enumeratee, to be consumed by the next action. that the bytes will be copied precisely is a combination of Enumerator It will either be part of the request once into our final buffer. 82 www.computer.org/internet/ IEEE INTERNET COMPUTING IC-15-03-funweb.indd 82 4/6/11 3:52 PM Warp: A Haskell Web Server It quickly became apparent that Instead, I ended up writing a request and returns a response. The the Builder abstraction would be an Enumeratee that would take a Request datatype contains informa- useful outside the context of HTML stream of Builders and use them to tion such as the requested path, query generation. The Yesod Web frame- fill up buffers. When a buffer filled, strings, request headers, and remote work immediately used it for gen- the Enumeratee would wrap it in a host/port. One thing noticeably lack- erating CSS, JavaScript, and JSON. Byte String and send it down the ing from this list is the request body. Meier split off the Builder datatype pipeline to the Iteratee. This meant To understand why, consider the fol- and its associated functions into a that the code produced optimally lowing type signature: separate blaze-builder package. sized ByteStrings, with minimal WAI and Warp rely heavily on buffer copying, and used constant type Application = Request → blaze-builder for constructing memory. Meier has since taken the Iteratee ByteString IO Response responses. Applications always send code, improved it, and released it as their response bodies to the server blaze-builder-enumerator. The Application returns its in the form of Builders. This lets It turns out that the exact same Response inside an Iteratee, so Warp efficiently append the body to requirements exist when writing a it consumes the request body from the response headers, meaning that, Web server. The application can give there. As mentioned previously, for many common responses, Warp the server chunks of data of any size, Warp performs all its operations uses only a single memory buf- and the server wants to concatenate inside the Iteratee monad; this fer and makes a single system call. these into optimally sized buffers means that calling the Application As a nice finishing touch, blaze- to minimize system-call overhead, is simply another step in that pro- builder provides a helper function without using large amounts of cess.
Recommended publications
  • Akka Java Documentation Release 2.2.5
    Akka Java Documentation Release 2.2.5 Typesafe Inc February 19, 2015 CONTENTS 1 Introduction 1 1.1 What is Akka?............................................1 1.2 Why Akka?..............................................3 1.3 Getting Started............................................3 1.4 The Obligatory Hello World.....................................7 1.5 Use-case and Deployment Scenarios.................................8 1.6 Examples of use-cases for Akka...................................9 2 General 10 2.1 Terminology, Concepts........................................ 10 2.2 Actor Systems............................................ 12 2.3 What is an Actor?.......................................... 14 2.4 Supervision and Monitoring..................................... 16 2.5 Actor References, Paths and Addresses............................... 19 2.6 Location Transparency........................................ 25 2.7 Akka and the Java Memory Model.................................. 26 2.8 Message Delivery Guarantees.................................... 28 2.9 Configuration............................................. 33 3 Actors 65 3.1 Actors................................................ 65 3.2 Typed Actors............................................. 84 3.3 Fault Tolerance............................................ 88 3.4 Dispatchers.............................................. 103 3.5 Mailboxes.............................................. 106 3.6 Routing................................................ 111 3.7 Building Finite State Machine
    [Show full text]
  • Thanos Tsouanas --- C.V
    Curriculum Vitæ Thanos Tsouanas 02/05/2017 I Personal details hello photo full name: Athanasios (Thanos) Tsouanas date of birth: 22/02/1983 place of birth: Athens, Greece nationality: Hellenic office address: IMD, Universidade Federal do Rio Grande do Norte Av. Cap. Mor Gouveia, S/N CEP: 59063-400, Natal{RN, Brasil phone number: (+55) (84) 9 8106-9789 (mobile, Telegram, WhatsApp) email address: [email protected] personal website: http://www.tsouanas.org/ GitHub: http://github.com/tsouanas Spoken languages Greek (native); English (proficient); Brazilian Portuguese (fluent). I Studies & academic positions 2016 { Associate professor (permanent position) in Instituto Metr´opole Digital of Universidade Federal do Rio Grande do Norte (UFRN), Brazil. 2015 Postdoctoral researcher in the Mathematics Department of Universidade Federal do Rio Grande do Norte (UFRN), Brazil. 2014 PhD from Ecole´ Normale Superieure´ de Lyon, under the supervision of Olivier Laurent, in the field of theoretical computer science. I was employed by CNRS under the Marie Curie fellowship \MALOA", and had a 1-month secondment split between the University of Oxford (in the team of Luke Ong) and Ecole´ Polytechnique (in the team of Dale Miller). Thesis title: On the Semantics of Disjunctive Logic Programs1 2010 Master of Science degree from MPLA (graduate program in Logic, Algorithms and Computation of the University of Athens and of the Technical University of Athens),2 mathematical logic specialty, grade 8.23/10. 2007 Bachelor's degree from the Department of Mathematics of the University of Athens, specialty of pure mathematics, grade \excellent" (8.51/10). Seminars and schools • Logoi school on Linear Logic and Geometry of Interaction.
    [Show full text]
  • Snap Creator Framework 4.3.3 Administration Guide
    Snap Creator® Framework 4.3.3 Administration Guide February 2021 | 215-14105_C0 [email protected] Snap Creator 4.3.3 Administration Guide ii Contents Contents What Snap Creator Framework does............................................................................ 6 Benefits of using Snap Creator....................................................................................................................................... 6 Snap Creator architecture...............................................................................................8 Snap Creator Server overview........................................................................................................................................ 8 Snap Creator Agent overview.......................................................................................................................................10 Plug-ins for application integration.............................................................................................................................. 11 Managing Snap Creator Server....................................................................................13 Starting, verifying, and stopping Snap Creator Server on Windows............................................................................ 13 Starting, verifying, and stopping Snap Creator Server on UNIX................................................................................. 13 Changing the Snap Creator Server port after installation.............................................................................................14
    [Show full text]
  • The Snap Framework: a Web Toolkit for Haskell
    The Functional Web The Snap Framework A Web Toolkit for Haskell Gregory Collins • Google Switzerland Doug Beardsley • Karamaan Group askell is an advanced functional pro- the same inputs, always produce the same out- gramming language. The product of more put. This property means that you almost always H than 20 years of research, it enables rapid decompose a Haskell program into smaller con- development of robust, concise, and fast soft- stituent parts that you can test independently. ware. Haskell supports integration with other Haskell’s ecosystem also includes many power- languages and has loads of built-in concurrency, ful testing and code-coverage tools. parallelism primitives, and rich libraries. With Haskell also comes out of the box with a set its state-of-the-art testing tools and an active of easy-to-use primitives for parallel and con- community, Haskell makes it easier to produce current programming and for performance pro- flexible, maintainable, high-quality software. filing and tuning. Applications built with GHC The most popular Haskell implementation is enjoy solid multicore performance and can han- the Glasgow Haskell Compiler (GHC), a high- dle hundreds of thousands of concurrent net- performance optimizing native-code compiler. work connections. We’ve been delighted to find Here, we look at Snap, a Web-development that Haskell really shines for Web programming. framework for Haskell. Snap combines many other Web-development environments’ best fea- What’s Snap? tures: writing Web code in an expressive high- Snap offers programmers a simple, expressive level language, a rapid development cycle, fast Web programming interface at roughly the same performance for native code, and easy deploy- level of abstraction as Java servlets.
    [Show full text]
  • What I Wish I Knew When Learning Haskell
    What I Wish I Knew When Learning Haskell Stephen Diehl 2 Version This is the fifth major draft of this document since 2009. All versions of this text are freely available onmywebsite: 1. HTML Version ­ http://dev.stephendiehl.com/hask/index.html 2. PDF Version ­ http://dev.stephendiehl.com/hask/tutorial.pdf 3. EPUB Version ­ http://dev.stephendiehl.com/hask/tutorial.epub 4. Kindle Version ­ http://dev.stephendiehl.com/hask/tutorial.mobi Pull requests are always accepted for fixes and additional content. The only way this document will stayupto date and accurate through the kindness of readers like you and community patches and pull requests on Github. https://github.com/sdiehl/wiwinwlh Publish Date: March 3, 2020 Git Commit: 77482103ff953a8f189a050c4271919846a56612 Author This text is authored by Stephen Diehl. 1. Web: www.stephendiehl.com 2. Twitter: https://twitter.com/smdiehl 3. Github: https://github.com/sdiehl Special thanks to Erik Aker for copyediting assistance. Copyright © 2009­2020 Stephen Diehl This code included in the text is dedicated to the public domain. You can copy, modify, distribute and perform thecode, even for commercial purposes, all without asking permission. You may distribute this text in its full form freely, but may not reauthor or sublicense this work. Any reproductions of major portions of the text must include attribution. The software is provided ”as is”, without warranty of any kind, express or implied, including But not limitedtothe warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authorsor copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, Arising from, out of or in connection with the software or the use or other dealings in the software.
    [Show full text]
  • Carnivorous Plant Newsletter V44 N4 December 2015
    Technical Refereed Contribution Several pygmy Sundew species possess catapult-flypaper traps with repetitive function, indicating a possible evolutionary change into aquatic snap traps similar to Aldrovanda Siegfried R. H. Hartmeyer and Irmgard Hartmeyer • Weil am Rhein • Germany • s.hartmeyer@ t-online.de • www.hartmeyer.de Keywords: Drosera, pygmy Sundew, Aldrovanda, Dionaea, Droseraceae, Collembola, carnivorous plant, catapult-flypaper trap, snap trap, snap-tentacle, functional morphology, phylogeny. Abstract: Approximately 50 species of pygmy Sundews (genus Drosera, section Bryastrum) occur in the South of Australia and one each in New Zealand (D. pygmaea) and Venezuela (D. meristo- caulis). They grow mainly as small stemless rosettes possessing minute trapping leaves of 1-2 mm diameter with prominent marginal tentacles, or have elongated erect stems. The caulescent species possess only mucus-producing tentacles that are most effective in capturing small flying insects. The acaulescent species in contrast are specialized on crawling prey (Verbeek & Boasson 1993) and have developed mucus-free snap-tentacles (Fig. 1), able to bend surprisingly rapidly towards the leaf center. They lift prey like, e.g. springtails (Collembola) from the ground and carry it with a 180°-movement from the periphery of the plant onto the sticky leaf. Our examinations brought to light that several small species of section Bryastrum are able to catapult small animals even within fractions of a second. If the whole leaf is touched, several or even all marginal tentacles perform such bending movements simultaneously. We documented this behavior on video, featured on our film “Catapults in Pygmyland” on YouTube (www.youtube.com/watch?v=5k7GYGibdjM). Our results prove that more than only one species in the genus Drosera possess rapidly moving catapult-flypaper traps and that the examined pygmy catapults show a further specialization and function repeatedly (in contrast to the one-shot snap tentacles of D.
    [Show full text]
  • DARPA and Data: a Portfolio Overview
    DARPA and Data: A Portfolio Overview William C. Regli Special Assistant to the Director Defense Advanced Research Projects Agency Brian Pierce Director Information Innovation Office Defense Advanced Research Projects Agency Fall 2017 Distribution Statement “A” (Approved for Public Release, Distribution Unlimited) 1 DARPA Dreams of Data • Investments over the past decade span multiple DARPA Offices and PMs • Information Innovation (I2O): Software Systems, AI, Data Analytics • Defense Sciences (DSO): Domain-driven problems (chemistry, social science, materials science, engineering design) • Microsystems Technology (MTO): New hardware to support these processes (neuromorphic processor, graph processor, learning systems) • Products include DARPA Program testbeds, data and software • The DARPA Open Catalog • Testbeds include those in big data, cyber-defense, engineering design, synthetic bio, machine reading, among others • Multiple layers and qualities of data are important • Important for reproducibility; important as fuel for future DARPA programs • Beyond public data to include “raw” data, process/workflow data • Data does not need to be organized to be useful or valuable • Software tools are getting better eXponentially, ”raw” data can be processed • Changing the economics (Forensic Data Curation) • Its about optimizing allocation of attention in human-machine teams Distribution Statement “A” (Approved for Public Release, Distribution Unlimited) 2 Working toward Wisdom Wisdom: sound judgment - governance Abstraction Wisdom (also Understanding:
    [Show full text]
  • Parsing with First-Class Derivatives
    Parsing with First-Class Derivatives Jonathan Immanuel Brachthauser¨ Tillmann Rendel Klaus Ostermann rtifact A Comple * t * te n * A * te is W E s A e n C l l L o D C S University of Tubingen,¨ Germany o * * c P u e m s E u O e e n v R t e O o d t a y * s E a * fbrachthaeuser, rendel, [email protected] l u d a e t Abstract often reducing the modularity of their parser because these ad- Brzozowski derivatives, well known in the context of reg- hoc additions are cross-cutting with respect to the otherwise ular expressions, have recently been rediscovered to give a context-free syntactic structure of the language. simplified explanation to parsers of context-free languages. Parser combinators [10, 10, 15, 21, 22] are a parsing We add derivatives as a novel first-class feature to a standard approach that is well-suited for such ad-hoc additions. With parser combinator language. First-class derivatives enable an parser combinators, a parser is described as a first-class inversion of the control flow, allowing to implement modular entity in some host language, and parsers for smaller subsets parsers for languages that previously required separate pre- of a language are combined into parsers of larger subsets processing steps or cross-cutting modifications of the parsers. using built-in or user-defined combinators such as sequence, We show that our framework offers new opportunities for alternative, or iteration. The fact that parsers are first-class reuse and supports a modular definition of interesting use entities at runtime allows an elegant way of structuring cases of layout-sensitive parsing.
    [Show full text]
  • Cherrypy Documentation Release 3.3.0
    CherryPy Documentation Release 3.3.0 CherryPy Team August 05, 2016 Contents 1 What is CherryPy? 1 2 What CherryPy is NOT? 3 3 Contents 5 3.1 Why choose CherryPy?.........................................5 3.2 Installation................................................6 3.3 CherryPy License (BSD).........................................8 4 Tutorial 9 4.1 What is this tutorial about?........................................9 4.2 Start the Tutorial.............................................9 5 Programmer’s Guide 35 5.1 Features.................................................. 35 5.2 HTTP details............................................... 66 6 Deployment Guide 79 6.1 Applications............................................... 79 6.2 Servers.................................................. 79 6.3 Environment............................................... 87 7 Reference Manual 91 7.1 cherrypy._cpchecker ....................................... 91 7.2 cherrypy._cpconfig ........................................ 92 7.3 cherrypy._cpdispatch – Mapping URI’s to handlers...................... 94 7.4 cherrypy._cprequest ....................................... 96 7.5 cherrypy._cpserver ........................................ 101 7.6 cherrypy._cptools ........................................ 103 7.7 cherrypy._cptree ......................................... 105 7.8 cherrypy._cpwsgi ......................................... 107 7.9 cherrypy ................................................ 108 7.10 cherrypy.lib...............................................
    [Show full text]
  • Kabbalah, Magic & the Great Work of Self Transformation
    KABBALAH, MAGIC AHD THE GREAT WORK Of SELf-TRAHSfORMATIOH A COMPL€T€ COURS€ LYAM THOMAS CHRISTOPHER Llewellyn Publications Woodbury, Minnesota Contents Acknowledgments Vl1 one Though Only a Few Will Rise 1 two The First Steps 15 three The Secret Lineage 35 four Neophyte 57 five That Darkly Splendid World 89 SIX The Mind Born of Matter 129 seven The Liquid Intelligence 175 eight Fuel for the Fire 227 ntne The Portal 267 ten The Work of the Adept 315 Appendix A: The Consecration ofthe Adeptus Wand 331 Appendix B: Suggested Forms ofExercise 345 Endnotes 353 Works Cited 359 Index 363 Acknowledgments The first challenge to appear before the new student of magic is the overwhehning amount of published material from which he must prepare a road map of self-initiation. Without guidance, this is usually impossible. Therefore, lowe my biggest thanks to Peter and Laura Yorke of Ra Horakhty Temple, who provided my first exposure to self-initiation techniques in the Golden Dawn. Their years of expe­ rience with the Golden Dawn material yielded a structure of carefully selected ex­ ercises, which their students still use today to bring about a gradual transformation. WIthout such well-prescribed use of the Golden Dawn's techniques, it would have been difficult to make progress in its grade system. The basic structure of the course in this book is built on a foundation of the Golden Dawn's elemental grade system as my teachers passed it on. In particular, it develops further their choice to use the color correspondences of the Four Worlds, a piece of the original Golden Dawn system that very few occultists have recognized as an ini­ tiatory tool.
    [Show full text]
  • Prioritizing Pull Requests
    Prioritizing pull requests Version of June 17, 2015 Erik van der Veen Prioritizing pull requests THESIS submitted in partial fulfillment of the requirements for the degree of MASTER OF SCIENCE in COMPUTER SCIENCE by Erik van der Veen born in Voorburg, the Netherlands Software Engineering Research Group Q42 Department of Software Technology Waldorpstraat 17F Faculty EEMCS, Delft University of Technology 2521 CA Delft, the Netherlands The Hague, the Netherlands www.ewi.tudelft.nl www.q42.com c 2014 Erik van der Veen. Cover picture: Finding the pull request that needs the most attention. Prioritizing pull requests Author: Erik van der Veen Student id: 1509381 Email: [email protected] Abstract Previous work showed that in the pull-based development model integrators face challenges with regard to prioritizing work in the face of multiple concurrent pull requests. We identified the manual prioritization heuristics applied by integrators and ex- tracted features from these heuristics. The features are used to train a machine learning model, which is capable of predicting a pull request’s importance. The importance is then used to create a prioritized order of the pull requests. Our main contribution is the design and initial implementation of a prototype service, called PRioritizer, which automatically prioritizes pull requests. The service works like a priority inbox for pull requests, recommending the top pull requests the project owner should focus on. It keeps the pull request list up-to-date when pull requests are merged or closed. In addition, the service provides functionality that GitHub is currently lacking. We implemented pairwise pull request conflict detection and several new filter and sorting options e.g.
    [Show full text]
  • Interleaving Data and Effects"
    Archived version from NCDOCKS Institutional Repository http://libres.uncg.edu/ir/asu/ Interleaving data and effects By: Robert Atkey and Patricia Johann Abstract: The study of programming with and reasoning about inductive datatypes such as lists and trees has benefited from the simple categorical principle of initial algebras. In initial algebra semantics, each inductive datatype is represented by an initial f-algebra for an appropriate functor f. The initial algebra principle then supports the straightforward derivation of definitional principles and proof principles for these datatypes. This technique has been expanded to a whole methodology of structured functional programming, often called origami programming.In this article we show how to extend initial algebra semantics from pure inductive datatypes to inductive datatypes interleaved with computational effects. Inductive datatypes interleaved with effects arise naturally in many computational settings. For example, incrementally reading characters from a file generates a list of characters interleaved with input/output actions, and lazily constructed infinite values can be represented by pure data interleaved with the possibility of non-terminating computation. Straightforward application of initial algebra techniques to effectful datatypes leads either to unsound conclusions if we ignore the possibility of effects, or to unnecessarily complicated reasoning because the pure and effectful concerns must be considered simultaneously. We show how pure and effectful concerns can be separated using the abstraction of initial f-and-m-algebras, where the functor f describes the pure part of a datatype and the monad m describes the interleaved effects. Because initial f-and-m-algebras are the analogue for the effectful setting of initial f- algebras, they support the extension of the standard definitional and proof principles to the effectful setting.
    [Show full text]