A History of Haskell: Being Lazy with Class April 16, 2007

Total Page:16

File Type:pdf, Size:1020Kb

A History of Haskell: Being Lazy with Class April 16, 2007 A History of Haskell: Being Lazy With Class April 16, 2007 Paul Hudak John Hughes Simon Peyton Jones Yale University Chalmers University Microsoft Research [email protected] [email protected] [email protected] Philip Wadler University of Edinburgh [email protected] Abstract lution that are distinctive in themselves, or that developed in un- expected or surprising ways. We reflect on five areas: syntax (Sec- This paper describes the history of Haskell, including its genesis tion 4); algebraic data types (Section 5); the type system, and type and principles, technical contributions, implementations and tools, classes in particular (Section 6); monads and input/output (Sec- and applications and impact. tion 7); and support for programming in the large, such as modules and packages, and the foreign-function interface (Section 8). 1. Introduction Part III describes implementations and tools: what has been built In September of 1987 a meeting was held at the confer- for the users of Haskell. We describe the various implementations ence on Functional Programming Languages and Computer of Haskell, including GHC, hbc, hugs, nhc, and Yale Haskell (Sec- Architecture in Portland, Oregon, to discuss an unfortunate tion 9), and tools for profiling and debugging (Section 10). situation in the functional programming community: there had come into being more than a dozen non-strict, purely Part IV describes applications and impact: what has been built by functional programming languages, all similar in expressive the users of Haskell. The language has been used for a bewildering power and semantic underpinnings. There was a strong con- variety of applications, and in Section 11 we reflect on the distinc- sensus at this meeting that more widespread use of this class tive aspects of some of these applications, so far as we can dis- of functional languages was being hampered by the lack of cern them. We conclude with a section that assesses the impact of a common language. It was decided that a committee should Haskell on various communities of users, such as education, open- be formed to design such a language, providing faster com- source, companies, and other language designers (Section 12). munication of new ideas, a stable foundation for real ap- Our goal throughout is to tell the story, including who was involved plications development, and a vehicle through which others and what inspired them: the paper is supposed to be a history rather would be encouraged to use functional languages. than a technical description or a tutorial. These opening words in the Preface of the first Haskell Report, We have tried to describe the evolution of Haskell in an even- Version 1.0 dated 1 April 1990, say quite a bit about the history of handed way, but we have also sought to convey some of the ex- Haskell. They establish the motivation for designing Haskell (the citement and enthusiasm of the process by including anecdotes and need for a common language), the nature of the language to be personal reflections. Inevitably, this desire for vividness means that designed (non-strict, purely functional), and the process by which our account will be skewed towards the meetings and conversations it was to be designed (by committee). in which we personally participated. However, we are conscious Part I of this paper describes genesis and principles: how Haskell that many, many people have contributed to Haskell. The size and came to be. We describe the developments leading up to Haskell quality of the Haskell community, its breadth and its depth, are both and its early history (Section 2) and the processes and principles the indicator of Haskell’s success and its cause. that guided its evolution (Section 3). One inevitable shortcoming is a lack of comprehensiveness. Haskell Part II describes Haskell’s technical contributions: what Haskell is. is now more than 15 years old and has been a seedbed for an im- We pay particular attention to aspects of the language and its evo- mense amount of creative energy. We cannot hope to do justice to all of it here, but we take this opportunity to salute all those who have contributed to what has turned out to be a wild ride. Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee. Third ACM SIGPLAN History of Programming Languages Conference (HOPL-III) San Diego, CA Copyright c 2007 ACM . $5.00 Part I Lisp, and showed soundness of their evaluator with respect to a denotational semantics. • David Turner (at St. Andrews and Kent) introduced a series Genesis and Principles of influential languages: SASL (St Andrews Static Language) (Turner, 1976), which was initially designed as a strict lan- guage in 1972 but became lazy in 1976, and KRC (Kent Re- 2. The genesis of Haskell cursive Calculator) (Turner, 1982). Turner showed the elegance In 1978 John Backus delivered his Turing Award lecture, “Can pro- of programming with lazy evaluation, and in particular the use gramming be liberated from the von Neumann style?” (Backus, of lazy lists to emulate many kinds of behaviours (Turner, 1981; 1978a), which positioned functional programming as a radical at- Turner, 1982). SASL was even used at Burroughs to develop an tack on the whole programming enterprise, from hardware archi- entire operating system—almost certainly the first exercise of tecture upwards. This prominent endorsement from a giant in the pure, lazy, functional programming “in the large”. field—Backus led the team that developed Fortran, and invented At the same time, there was a symbiotic effort on exciting new ways Backus Naur Form (BNF)—put functional programming on the to implement lazy languages. In particular: map in a new way, as a practical programming tool rather than a mathematical curiosity. • In software, a variety of techniques based on graph reduction were being explored, and in particular Turner’s inspirationally Even at that stage, functional programming languages had a long elegant use of SK combinators (Turner, 1979b; Turner, 1979a). history, beginning with John McCarthy’s invention of Lisp in the (Turner’s work was based on Haskell Curry’s combinatory cal- late 1950s (McCarthy, 1960). In the 1960s, Peter Landin and culus (Curry and Feys, 1958), a variable-less version of Alonzo Christopher Strachey identified the fundamental importance of the Church’s lambda calculus (Church, 1941).) lambda calculus for modelling programming languages and laid the foundations of both operational semantics, through abstract • Another potent ingredient was the possibility that all this would machines (Landin, 1964), and denotational semantics (Strachey, lead to a radically different non-von Neumann hardware archi- 1964). A few years later Strachey’s collaboration with Dana Scott tectures. Several serious projects were underway (or were get- put denotational semantics on firm mathematical foundations un- ting underway) to build dataflow and graph reduction machines derpinned by Scott’s domain theory (Scott and Strachey, 1971; of various sorts, including the Id project at MIT (Arvind and Scott, 1976). In the early ’70s, Rod Burstall and John Darling- Nikhil, 1987), the Rediflow project at Utah (Keller et al., 1979), ton were doing program transformation in a first-order functional the SK combinator machine SKIM at Cambridge (Stoye et al., language with function definition by pattern matching (Burstall 1984), the Manchester dataflow machine (Watson and Gurd, and Darlington, 1977). Over the same period David Turner, a for- 1982), the ALICE parallel reduction machine at Imperial (Dar- mer student of Strachey, developed SASL (Turner, 1976), a pure lington and Reeve, 1981), the Burroughs NORMA combinator higher-order functional language with lexically scoped variables— machine (Scheevel, 1986), and the DDM dataflow machine at a sugared lambda calculus derived from the applicative subset of Utah (Davis, 1977). Much (but not all) of this architecturally Landin’s ISWIM (Landin, 1966)—that incorporated Burstall and oriented work turned out to be a dead end, when it was later dis- Darlington’s ideas on pattern matching into an executable program- covered that good compilers for stock architecture could outper- ming language. form specialised architecture. But at the time it was all radical and exciting. In the late ’70s, Gerry Sussman and Guy Steele developed Scheme, a dialect of Lisp that adhered more closely to the lambda calcu- Several significant meetings took place in the early ’80s that lent lus by implementing lexical scoping (Sussman and Steele, 1975; additional impetus to the field. Steele, 1978). At more or less the same time, Robin Milner in- In August 1980, the first Lisp conference took place in Stanford, vented ML as a meta-language for the theorem prover LCF at Ed- California. Presentations included Rod Burstall, Dave MacQueen, inburgh (Gordon et al., 1979). Milner’s polymorphic type system and Don Sannella on Hope, the language that introduced algebraic for ML would prove to be particularly influential (Milner, 1978; data types (Burstall et al., 1980). Damas and Milner, 1982). Both Scheme and ML were strict (call- by-value) languages and, although they contained imperative fea- In July 1981, Peter Henderson, John Darlington, and David Turner tures, they did much to promote the functional programming style ran an Advanced Course on Functional Programming and its Appli- and in particular the use of higher-order functions. cations, in Newcastle (Darlington et al., 1982). All the big names were there: attendees included Gerry Sussman, Gary Lindstrom, 2.1 The call of laziness David Park, Manfred Broy, Joe Stoy, and Edsger Dijkstra.
Recommended publications
  • Structure Interpretation of Text Formats
    1 1 Structure Interpretation of Text Formats 2 3 SUMIT GULWANI, Microsoft, USA 4 VU LE, Microsoft, USA 5 6 ARJUN RADHAKRISHNA, Microsoft, USA 7 IVAN RADIČEK, Microsoft, Austria 8 MOHAMMAD RAZA, Microsoft, USA 9 Data repositories often consist of text files in a wide variety of standard formats, ad-hoc formats, aswell 10 mixtures of formats where data in one format is embedded into a different format. It is therefore a significant 11 challenge to parse these files into a structured tabular form, which is important to enable any downstream 12 data processing. 13 We present Unravel, an extensible framework for structure interpretation of ad-hoc formats. Unravel 14 can automatically, with no user input, extract tabular data from a diverse range of standard, ad-hoc and 15 mixed format files. The framework is also easily extensible to add support for previously unseen formats, 16 and also supports interactivity from the user in terms of examples to guide the system when specialized data extraction is desired. Our key insight is to allow arbitrary combination of extraction and parsing techniques 17 through a concept called partial structures. Partial structures act as a common language through which the file 18 structure can be shared and refined by different techniques. This makes Unravel more powerful than applying 19 the individual techniques in parallel or sequentially. Further, with this rule-based extensible approach, we 20 introduce the novel notion of re-interpretation where the variety of techniques supported by our system can 21 be exploited to improve accuracy while optimizing for particular quality measures or restricted environments.
    [Show full text]
  • The Marriage of Effects and Monads
    The Marriage of Effects and Monads PHILIP WADLER Avaya Labs and PETER THIEMANN Universit¨at Freiburg Gifford and others proposed an effect typing discipline to delimit the scope of computational ef- fects within a program, while Moggi and others proposed monads for much the same purpose. Here we marry effects to monads, uniting two previously separate lines of research. In partic- ular, we show that the type, region, and effect system of Talpin and Jouvelot carries over di- rectly to an analogous system for monads, including a type and effect reconstruction algorithm. The same technique should allow one to transpose any effect system into a corresponding monad system. Categories and Subject Descriptors: D.3.1 [Programming Languages]: Formal Definitions and Theory; F.3.2 [Logics and Meanings of Programs]: Semantics of Programming Languages— Operational semantics General Terms: Languages, Theory Additional Key Words and Phrases: Monad, effect, type, region, type reconstruction 1. INTRODUCTION Computational effects, such as state or continuations, are powerful medicine. If taken as directed they may cure a nasty bug, but one must be wary of the side effects. For this reason, many researchers in computing seek to exploit the benefits of computational effects while delimiting their scope. Two such lines of research are the effect typing discipline, proposed by Gifford and Lucassen [Gifford and Lucassen 1986; Lucassen 1987], and pursued by Talpin and Jouvelot [Talpin and Jouvelot 1992, 1994; Talpin 1993] among others, and the use of monads, proposed by Moggi [1989, 1990], and pursued by Wadler [1990, 1992, 1993, 1995] among others. Effect systems are typically found in strict languages, such as FX [Gifford et al.
    [Show full text]
  • Functional Programming Is Style of Programming in Which the Basic Method of Computation Is the Application of Functions to Arguments;
    PROGRAMMING IN HASKELL Chapter 1 - Introduction 0 What is a Functional Language? Opinions differ, and it is difficult to give a precise definition, but generally speaking: • Functional programming is style of programming in which the basic method of computation is the application of functions to arguments; • A functional language is one that supports and encourages the functional style. 1 Example Summing the integers 1 to 10 in Java: int total = 0; for (int i = 1; i 10; i++) total = total + i; The computation method is variable assignment. 2 Example Summing the integers 1 to 10 in Haskell: sum [1..10] The computation method is function application. 3 Historical Background 1930s: Alonzo Church develops the lambda calculus, a simple but powerful theory of functions. 4 Historical Background 1950s: John McCarthy develops Lisp, the first functional language, with some influences from the lambda calculus, but retaining variable assignments. 5 Historical Background 1960s: Peter Landin develops ISWIM, the first pure functional language, based strongly on the lambda calculus, with no assignments. 6 Historical Background 1970s: John Backus develops FP, a functional language that emphasizes higher-order functions and reasoning about programs. 7 Historical Background 1970s: Robin Milner and others develop ML, the first modern functional language, which introduced type inference and polymorphic types. 8 Historical Background 1970s - 1980s: David Turner develops a number of lazy functional languages, culminating in the Miranda system. 9 Historical Background 1987: An international committee starts the development of Haskell, a standard lazy functional language. 10 Historical Background 1990s: Phil Wadler and others develop type classes and monads, two of the main innovations of Haskell.
    [Show full text]
  • GHC Reading Guide
    GHC Reading Guide - Exploring entrances and mental models to the source code - Takenobu T. Rev. 0.01.1 WIP NOTE: - This is not an official document by the ghc development team. - Please refer to the official documents in detail. - Don't forget “semantics”. It's very important. - This is written for ghc 9.0. Contents Introduction 1. Compiler - Compilation pipeline - Each pipeline stages - Intermediate language syntax - Call graph 2. Runtime system 3. Core libraries Appendix References Introduction Introduction Official resources are here GHC source repository : The GHC Commentary (for developers) : https://gitlab.haskell.org/ghc/ghc https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary GHC Documentation (for users) : * master HEAD https://ghc.gitlab.haskell.org/ghc/doc/ * latest major release https://downloads.haskell.org/~ghc/latest/docs/html/ * version specified https://downloads.haskell.org/~ghc/9.0.1/docs/html/ The User's Guide Core Libraries GHC API Introduction The GHC = Compiler + Runtime System (RTS) + Core Libraries Haskell source (.hs) GHC compiler RuntimeSystem Core Libraries object (.o) (libHsRts.o) (GHC.Base, ...) Linker Executable binary including the RTS (* static link case) Introduction Each division is located in the GHC source tree GHC source repository : https://gitlab.haskell.org/ghc/ghc compiler/ ... compiler sources rts/ ... runtime system sources libraries/ ... core library sources ghc/ ... compiler main includes/ ... include files testsuite/ ... test suites nofib/ ... performance tests mk/ ... build system hadrian/ ... hadrian build system docs/ ... documents : : 1. Compiler 1. Compiler Compilation pipeline 1. compiler The GHC compiler Haskell language GHC compiler Assembly language (native or llvm) 1. compiler GHC compiler comprises pipeline stages GHC compiler Haskell language Parser Renamer Type checker Desugarer Core to Core Core to STG STG to Cmm Assembly language Cmm to Asm (native or llvm) 1.
    [Show full text]
  • The Machine That Builds Itself: How the Strengths of Lisp Family
    Khomtchouk et al. OPINION NOTE The Machine that Builds Itself: How the Strengths of Lisp Family Languages Facilitate Building Complex and Flexible Bioinformatic Models Bohdan B. Khomtchouk1*, Edmund Weitz2 and Claes Wahlestedt1 *Correspondence: [email protected] Abstract 1Center for Therapeutic Innovation and Department of We address the need for expanding the presence of the Lisp family of Psychiatry and Behavioral programming languages in bioinformatics and computational biology research. Sciences, University of Miami Languages of this family, like Common Lisp, Scheme, or Clojure, facilitate the Miller School of Medicine, 1120 NW 14th ST, Miami, FL, USA creation of powerful and flexible software models that are required for complex 33136 and rapidly evolving domains like biology. We will point out several important key Full list of author information is features that distinguish languages of the Lisp family from other programming available at the end of the article languages and we will explain how these features can aid researchers in becoming more productive and creating better code. We will also show how these features make these languages ideal tools for artificial intelligence and machine learning applications. We will specifically stress the advantages of domain-specific languages (DSL): languages which are specialized to a particular area and thus not only facilitate easier research problem formulation, but also aid in the establishment of standards and best programming practices as applied to the specific research field at hand. DSLs are particularly easy to build in Common Lisp, the most comprehensive Lisp dialect, which is commonly referred to as the “programmable programming language.” We are convinced that Lisp grants programmers unprecedented power to build increasingly sophisticated artificial intelligence systems that may ultimately transform machine learning and AI research in bioinformatics and computational biology.
    [Show full text]
  • Paul Graham's Revenge of the Nerds
    Paul Graham’s Revenge of the Nerds What made Lisp different Symbols and S-Expression Trees 6. Programs composed of expressions. Lisp programs are trees of expressions, each of which returns a value. … 7. A symbol type. Symbols are effecBvely pointers to strings stored in a hash table. So you can test equality by comparing a pointer, instead of comparing each character. 8. A notation for code using trees of symbols and constants. CS251 Programming [Lyn adds: these trees are called symbolic expressions = s-expressions] Languages 9. The whole language there all the time. There is no real distinction Spring 2018, Lyn Turbak between read-time, compile-time, and runtime. … reading at runtime enables programs to communicate using s-expressions, an idea recently reinvented Department of Computer Science as XML. [Lyn adds: and JSON!] Wellesley College Symbols & S-expressions 2 Symbols TesBng Symbols for Equality: eq? Lisp was invented to do symbolic processing. (This was thought to be the core of ArBficial Intelligence, and disBnguished Lisp from Fortran (the other The key thing we do with symbols is test them for equality main language at the Bme), whose strength with numerical processing.) with eq? (pronounced “eek”). A symbol is eq? to itself and A key Racket value is the symbol. nothing else. The symbol cat is wriNen (quote cat) or 'cat. > (eq? 'cat 'cat) Symbols are values and so evaluate to themselves. #t > 'cat > (map (λ (s) (eq? s 'to)) 'cat (list 'to 'be 'or 'not 'to 'be)) '(#t #f #f #f #t #f) ; 'thing is just an abbreviation for (quote thing) > (quote cat) 'cat Symbols are similar to strings, except they’re atomic; we don’t do character manipulaBons on them.
    [Show full text]
  • Functional Programming at Facebook
    Functional Programming at Facebook Chris Piro, Eugene Letuchy Commercial Users of Functional Programming (CUFP) Edinburgh, Scotland ! September "##$ Agenda ! Facebook and Chat " Chat architecture # Erlang strengths $ Setbacks % What has worked Facebook The Facebook Environment The Facebook Environment ▪ The web site ▪ More than 250 million active users ▪ More than 3.5 billion minutes are spent on Facebook each day The Facebook Environment ▪ The web site ▪ More than 250 million active users ▪ More than 3.5 billion minutes are spent on Facebook each day ▪ The engineering team ▪ Fast iteration: code gets out to production within a week ▪ Polyglot programming: interoperability with Thrift ▪ Practical: high-leverage tools win Using FP at Facebook Using FP at Facebook ▪ Erlang ▪ Chat backend (channel servers) ▪ Chat Jabber interface (ejabberd) ▪ AIM presence: a JSONP validator Using FP at Facebook ▪ Erlang ▪ Chat backend (channel servers) ▪ Chat Jabber interface (ejabberd) ▪ AIM presence: a JSONP validator ▪ Haskell ▪ lex-pass: PHP parse transforms ▪ Lambdabot ▪ textbook: command line Facebook API client ▪ Thrift binding Thrift Thrift ▪ An efficient, cross-language serialization and RPC framework Thrift ▪ An efficient, cross-language serialization and RPC framework ▪ Write interoperable servers and clients Thrift ▪ An efficient, cross-language serialization and RPC framework ▪ Write interoperable servers and clients ▪ Includes library and code generator for each language Thrift ▪ An efficient, cross-language serialization and RPC framework ▪ Write
    [Show full text]
  • The Power of Higher-Order Composition Languages in System Design
    The Power of Higher-Order Composition Languages in System Design James Adam Cataldo Electrical Engineering and Computer Sciences University of California at Berkeley Technical Report No. UCB/EECS-2006-189 http://www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-189.html December 18, 2006 Copyright © 2006, by the author(s). All rights reserved. Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission. The Power of Higher-Order Composition Languages in System Design by James Adam Cataldo B.S. (Washington University in St. Louis) 2001 M.S. (University of California, Berkeley) 2003 A dissertation submitted in partial satisfaction of the requirements for the degree of Doctor of Philosophy in Electrical Engineering in the GRADUATE DIVISION of the UNIVERSITY OF CALIFORNIA, BERKELEY Committee in charge: Professor Edward Lee, Chair Professor Alberto Sangiovanni-Vincentelli Professor Raja Sengupta Fall 2006 The dissertation of James Adam Cataldo is approved: Chair Date Date Date University of California, Berkeley Fall 2006 The Power of Higher-Order Composition Languages in System Design Copyright 2006 by James Adam Cataldo 1 Abstract The Power of Higher-Order Composition Languages in System Design by James Adam Cataldo Doctor of Philosophy in Electrical Engineering University of California, Berkeley Professor Edward Lee, Chair This dissertation shows the power of higher-order composition languages in system design.
    [Show full text]
  • A Highly Configurable High-Level Synthesis Functional Pattern Library
    electronics Article A Highly Configurable High-Level Synthesis Functional Pattern Library Lan Huang 1,2,‡, Teng Gao 1,‡, Dalin Li 1,†, Zihao Wang 1 and Kangping Wang 1,2,* 1 College of Computer Science and Technology, Jilin University, Changchun 130012, China; [email protected] (L.H.); [email protected] (T.G.); [email protected] (D.L.); [email protected] (Z.W.) 2 Key Laboratory of Symbolic Computation and Knowledge Engineering, Jilin University, Changchun 130012, China * Correspondence: [email protected] † Current address: Zhuhai Laboratory of Key Laboratory of Symbol Computation and Knowledge Engineering of Ministry of Education, Department of Computer Science and Technology, Zhuhai College of Jilin University, Zhuhai 519041, China. ‡ These authors contributed equally to this work. Abstract: FPGA has recently played an increasingly important role in heterogeneous computing, but Register Transfer Level design flows are not only inefficient in design, but also require designers to be familiar with the circuit architecture. High-level synthesis (HLS) allows developers to design FPGA circuits more efficiently with a more familiar programming language, a higher level of abstraction, and automatic adaptation of timing constraints. When using HLS tools, such as Xilinx Vivado HLS, specific design patterns and techniques are required in order to create high-performance circuits. Moreover, designing efficient concurrency and data flow structures requires a deep understanding of the hardware, imposing more learning costs on programmers. In this paper, we propose a set of functional patterns libraries based on the MapReduce model, implemented by C++ templates, Citation: Huang, L.; Gao,T.; Li, D.; which can quickly implement high-performance parallel pipelined computing models on FPGA with Wang, Z.; Wang, K.
    [Show full text]
  • Dynamic Extension of Typed Functional Languages
    Dynamic Extension of Typed Functional Languages Don Stewart PhD Dissertation School of Computer Science and Engineering University of New South Wales 2010 Supervisor: Assoc. Prof. Manuel M. T. Chakravarty Co-supervisor: Dr. Gabriele Keller Abstract We present a solution to the problem of dynamic extension in statically typed functional languages with type erasure. The presented solution re- tains the benefits of static checking, including type safety, aggressive op- timizations, and native code compilation of components, while allowing extensibility of programs at runtime. Our approach is based on a framework for dynamic extension in a stat- ically typed setting, combining dynamic linking, runtime type checking, first class modules and code hot swapping. We show that this framework is sufficient to allow a broad class of dynamic extension capabilities in any statically typed functional language with type erasure semantics. Uniquely, we employ the full compile-time type system to perform run- time type checking of dynamic components, and emphasize the use of na- tive code extension to ensure that the performance benefits of static typing are retained in a dynamic environment. We also develop the concept of fully dynamic software architectures, where the static core is minimal and all code is hot swappable. Benefits of the approach include hot swappable code and sophisticated application extension via embedded domain specific languages. We instantiate the concepts of the framework via a full implementation in the Haskell programming language: providing rich mechanisms for dy- namic linking, loading, hot swapping, and runtime type checking in Haskell for the first time. We demonstrate the feasibility of this architecture through a number of novel applications: an extensible text editor; a plugin-based network chat bot; a simulator for polymer chemistry; and xmonad, an ex- tensible window manager.
    [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]
  • Richard S. Uhler
    Smten and the Art of Satisfiability-Based Search by Richard S. Uhler B.S., University of California, Los Angeles (2008) S.M., Massachusetts Institute of Technology (2010) Submitted to the Department of Electrical Engineering and Computer Science in partial fulfillment of the requirements for the degree of Doctor of Philosophy in Electrical Engineering and Computer Science at the MASSACHUSETTS INSTITUTE OF TECHNOLOGY September 2014 c Massachusetts Institute of Technology 2014. All rights reserved. Author.............................................................. Department of Electrical Engineering and Computer Science August 22, 2014 Certified by. Jack B. Dennis Professor of Computer Science and Engineering Emeritus Thesis Supervisor Accepted by . Leslie A. Kolodziejski Chairman, Committee for Graduate Students 2 Smten and the Art of Satisfiability-Based Search by Richard S. Uhler Submitted to the Department of Electrical Engineering and Computer Science on August 22, 2014, in partial fulfillment of the requirements for the degree of Doctor of Philosophy in Electrical Engineering and Computer Science Abstract Satisfiability (SAT) and Satisfiability Modulo Theories (SMT) have been leveraged in solving a wide variety of important and challenging combinatorial search prob- lems, including automatic test generation, logic synthesis, model checking, program synthesis, and software verification. Though in principle SAT and SMT solvers sim- plify the task of developing practical solutions to these hard combinatorial search problems, in practice developing an application that effectively uses a SAT or SMT solver can be a daunting task. SAT and SMT solvers have limited support, if any, for queries described using the wide array of features developers rely on for describing their programs: procedure calls, loops, recursion, user-defined data types, recursively defined data types, and other mechanisms for abstraction, encapsulation, and modu- larity.
    [Show full text]