This paper describes the history of Haskell, including its genesisand principles, technical contributions, implementations and tools,and applications and impact.

1. Introduction

In September of 1987 a meeting was held at the confer-ence on Functional Programming Languages and ComputerArchitecture in Portland, Oregon, to discuss an unfortunatesituation in the functional programming community: therehad come into being more than a dozen non-strict, purelyfunctional programming languages, all similar in expressivepower and semantic underpinnings. There was a strong con-sensus at this meeting that more widespread use of this classof functional languages was being hampered by the lack of a common language. It was decided that acommittee shouldbe formed to design such a language, providing faster com-munication of new ideas, a stable foundation for real ap-plications development, and a vehicle through which otherswould be encouraged to use functional languages.These opening words in the Preface of the ﬁrst Haskell Report,Version 1.0 dated 1 April 1990, say quite a bit about the history of Haskell. They establish the motivation for designing Haskell (theneed for a common language), the nature of the language to bedesigned (non-strict, purely functional), and the process by whichit was to be designed (by committee).Part I of this paper describes genesis and principles: how Haskellcame to be. We describe the developments leading up to Haskelland its early history (Section 2) and the processes and principlesthat guided its evolution (Section 3).Part II describes Haskell’s technical contributions: what Haskell is.We pay particular attention to aspects of the language and its evo-

Permission to make digital or hard copies of all or part of this work for personal orclassroom use is granted without fee provided that copies are not made or distributedfor proﬁt or commercial advantage and that copies bear this notice and the full citationon the ﬁrst page. To copy otherwise, to republish, to post on servers or to redistributeto lists, requires prior speciﬁc permission and/or a fee.

Third ACM SIGPLAN History of Programming Languages Conference (HOPL-III)

San Diego, CACopyrightc



2007 ACM ...$5.00

lution that are distinctive in themselves, or that developed in un-expected or surprising ways. We reﬂect on ﬁve areas: syntax (Sec-tion 4); algebraic data types (Section 5); the type system, and typeclasses in particular (Section 6); monads and input/output (Sec-tion 7); and support for programming in the large, such as modulesand packages, and the foreign-function interface (Section 8).Part III describes implementations and tools: what has been built

for

the users of Haskell. We describe the various implementationsof Haskell, including GHC, hbc, hugs, nhc, and Yale Haskell (Sec-tion 9), and tools for proﬁling and debugging (Section 10).Part IV describes applications and impact: what has been built

by

the users of Haskell. The language has been used for a bewilderingvariety of applications, and in Section 11 we reﬂect on the distinc-tive aspects of some of these applications, so far as we can dis-cern them. We conclude with a section that assesses the impact of Haskell on various communities of users, such as education, open-source, companies, and other language designers (Section 12).Our goal throughout is to tell the story, including who was involvedand what inspired them: the paper is supposed to be a

history

ratherthan a technical description or a tutorial.We have tried to describe the evolution of Haskell in an even-handed way, but we have also sought to convey some of the ex-citement and enthusiasm of the process by including anecdotes andpersonal reﬂections. Inevitably, this desire for vividness means thatour account will be skewed towards the meetings and conversationsin which we personally participated. However, we are consciousthat many, many people have contributed to Haskell. The size andquality of the Haskell community, its breadth and its depth, areboththe indicator of Haskell’s success and its cause.Oneinevitableshortcoming isalackof comprehensiveness. Haskellis now more than 15 years old and has been a seedbed for an im-mense amount of creative energy. We cannot hope to do justice toall of it here, but we take this opportunity to salute all those whohave contributed to what has turned out to be a wild ride.

Part I

Genesis and Principles

2. The genesis of Haskell

In 1978 John Backus delivered his Turing Award lecture, “Can pro-gramming be liberated from the von Neumann style?” (Backus,1978a), which positioned functional programming as a radical at-tack on the whole programming enterprise, from hardware archi-tecture upwards. This prominent endorsement from a giant in theﬁeld—Backus led the team that developed Fortran, and inventedBackus Naur Form (BNF)—put functional programming on themap in a new way, as a practical programming tool rather than amathematical curiosity.Even at that stage, functional programming languages had a longhistory, beginning with John McCarthy’s invention of Lisp in thelate 1950s (McCarthy, 1960). In the 1960s, Peter Landin andChristopher Strachey identiﬁed the fundamental importance of thelambda calculus for modelling programming languages and laidthe foundations of both operational semantics, through abstractmachines (Landin, 1964), and denotational semantics (Strachey,1964). A few years later Strachey’s collaboration with Dana Scottput denotational semantics on ﬁrm mathematical foundations un-derpinned by Scott’s domain theory (Scott and Strachey, 1971;Scott, 1976). In the early ’70s, Rod Burstall and John Darling-ton were doing program transformation in a ﬁrst-order functionallanguage with function deﬁnition by pattern matching (Burstalland Darlington, 1977). Over the same period David Turner, a for-mer student of Strachey, developed SASL (Turner, 1976), a purehigher-order functional language with lexically scoped variables—a sugared lambda calculus derived from the applicative subset of Landin’s ISWIM (Landin, 1966)—that incorporated Burstall andDarlington’s ideas on pattern matching into an executable program-ming language.In the late ’70s, Gerry Sussman and Guy Steele developed Scheme,a dialect of Lisp that adhered more closely to the lambda calcu-lus by implementing lexical scoping (Sussman and Steele, 1975;Steele, 1978). At more or less the same time, Robin Milner in-vented ML as a meta-language for the theorem prover LCF at Ed-inburgh (Gordon et al., 1979). Milner’s polymorphic type systemfor ML would prove to be particularly inﬂuential (Milner, 1978;Damas and Milner, 1982). Both Scheme and ML were strict (call-by-value) languages and, although they contained imperative fea-tures, they did much to promote the functional programming styleand in particular the use of higher-order functions.

2.1 The call of laziness

Then, in the late ’70s and early ’80s, something new happened. Aseries of seminal publications ignited an explosion of interest in theidea of

Dan Friedman and David Wise (both at Indiana) published“Cons should not evaluate its arguments” (Friedman and Wise,1976), which took on lazy evaluation from a Lisp perspective.

•

Peter Henderson (at Newcastle) and James H. Morris Jr. (atXerox PARC) published “A lazy evaluator” (Henderson andMorris, 1976). They cite Vuillemin (Vuillemin, 1974) andWadsworth (Wadsworth, 1971) as responsible for the origins of the idea, but popularised the idea in POPL and made one otherimportant contribution, the name. They also used a variant of Lisp, and showed soundness of their evaluator with respect to adenotational semantics.

•

David Turner (at St. Andrews and Kent) introduced a seriesof inﬂuential 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-cursive Calculator) (Turner, 1982). Turner showed the eleganceof programming with lazy evaluation, and in particular the useof lazy lists to emulate many kinds of behaviours (Turner, 1981;Turner, 1982). SASL was even used at Burroughs to develop anentire operating system—almost certainly the ﬁrst exercise of pure, lazy, functional programming “in the large”.Atthesametime,therewas asymbioticeffort onexcitingnew waysto

implement

lazy languages. In particular:

•

In software, a variety of techniques based on

graph reduction

were being explored, and in particular Turner’s inspirationallyelegant use of

SK combinators

(Turner, 1979b; Turner, 1979a).(Turner’s work was based on Haskell Curry’s

combinatory cal-culus

(Curry and Feys, 1958), a variable-less version of AlonzoChurch’s lambda calculus (Church, 1941).)

•

Another potent ingredient was the possibility that all this wouldlead to a radically different non-von Neumann hardware archi-tectures. Several serious projects were underway (or were get-ting underway) to build

dataﬂow

and

graph reduction

machinesof various sorts, including the Id project at MIT (Arvind andNikhil, 1987), the Rediﬂow project at Utah (Keller et al., 1979),the SK combinator machine SKIM at Cambridge (Stoye et al.,1984), the Manchester dataﬂow machine (Watson and Gurd,1982), the ALICE parallel reduction machine at Imperial (Dar-lington and Reeve, 1981), the Burroughs NORMA combinatormachine (Scheevel, 1986), and the DDM dataﬂow machine atUtah (Davis, 1977). Much (but not all) of this architecturallyoriented work turned out to be a dead end, when it was laterdis-coveredthat good compilers forstockarchitecturecould outper-form specialised architecture. But at the time it was all radicaland exciting.Several signiﬁcant meetings took place in the early ’80s that lentadditional impetus to the ﬁeld.In August 1980, the ﬁrst Lisp conference took place in Stanford,California. Presentations included Rod Burstall, Dave MacQueen,and Don Sannella on Hope, the language that introduced algebraicdata types (Burstall et al., 1980).In July 1981, Peter Henderson, John Darlington, and David Turnerranan Advanced Courseon Functional Programming and itsAppli-cations, in Newcastle (Darlington et al., 1982). All the big nameswere there: attendees included Gerry Sussman, Gary Lindstrom,David Park, Manfred Broy, Joe Stoy, and Edsger Dijkstra. (Hughesand Peyton Jones attended as students.) Dijkstra was characteris-tically unimpressed—he wrote “On the whole I could not avoidsome feelings of deep disappointment. I still believe that the topicdeserves a much more adequate treatment; quite a lot we were ex-posed to was deﬁnitely not up to par.” (Dijkstra, 1981)—but formany attendees it was a watershed.In September 1981, the ﬁrst conference on Functional Program-ming Languages and Computer Architecture (FPCA)—note thetitle!—took place in Portsmouth, New Hampshire. Here Turnergave his inﬂuential paper on “The semantic elegance of applicativelanguages” (Turner, 1981). (Wadler also presented his ﬁrst confer-ence paper.) FPCA became a key biennial conference in the ﬁeld.In September 1982, the second Lisp conference, now renamedLisp and Functional Programming (LFP), took place in Pittsburgh,

Pennsylvania. Presentations included Peter Henderson on func-tional geometry (Henderson, 1982) and an invited talkby Turner onprogramming with inﬁnitedata structures. (It also saw the ﬁrst pub-lished papers of Hudak, Hughes, and Peyton Jones.) Special guestsat this conference included Church and Curry. The after-dinner talk was given by Barkley Rosser, and received two ovations in the mid-dle, once when he presented the proof of Curry’s paradox, relatingit to the Y combinator, and once when he presented a new proof of the Church-Rosser theorem. LFP became the other key biennialconference.(In 1996, FPCA merged with LFP to become the annual Interna-tional Conference on Functional Programming, ICFP, which re-mains the key conference in the ﬁeld to the present day.)In August 1987, Ham Richards of the University of Texas andDavid Turner organised an international school on DeclarativeProgramming in Austin, Texas, as part of the UT “Year of Pro-gramming”. Speakers included: Samson Abramsky, John Backus,Richard Bird, Peter Buneman, Robert Cartwright, Simon Thomp-son, David Turner, and Hughes. A major part of the school was acourse in lazy functional programming, with practical classes usingMiranda.All of this led to a tremendous sense of excitement. The simplic-ity and elegance of functional programming captivated the presentauthors, and many other researchers with them. Lazy evaluation—with its direct connection to the pure, call-by-name lambda cal-culus, the remarkable possibility of representing and manipulatinginﬁnite data structures, and addictively simple and beautiful imple-mentation techniques—was like a drug.(An anonymous reviewer supplied the following: “An interestingsidelight is that the Friedman and Wisepaper inspired Sussman andSteele to examine lazy evaluation in Scheme, and for a time theyweighed whether to make the revised version of Scheme call-by-name or call-by-value. They eventually chose to retain the originalcall-by-value design, reasoning that it seemed to be much easier tosimulate call-by-name in a call-by-value language (using lambda-expressions as thunks) than to simulate call-by-value in a call-by-namelanguage (whichrequires aseparateevaluation-forcing mech-anism). Whatever we might think of that reasoning, we can onlyspeculate on how different the academic programming-languagelandscape might be today had they made the opposite decision.”)

2.2 A tower of Babel

As a result of all this activity, by the mid-1980s there were a num-ber of researchers, including the authors, who were keenly inter-ested in both design and implementation techniques for pure, lazylanguages. In fact, many of us had independently designed our ownlazy languages and were busily building our own implementationsfor them. We were each writing papers about our efforts, in whichwe ﬁrst had to describe our languages before we could describe ourimplementation techniques. Languages that contributed to this lazyTower of Babel include:

•

Miranda, a successor to SASL and KRC, designed and imple-mented by David Turnerusing SK combinator reduction. WhileSASL and KRC were untyped, Miranda added strong polymor-phic typing and type inference, ideas that had proven very suc-cessful in ML.

•

Lazy ML (LML), pioneered at Chalmers by Augustsson andJohnsson, and taken up at University CollegeLondon by PeytonJones. This effort included the inﬂuential development of the

G-machine

, which showed that one could

compile

lazy functionalprograms to rather efﬁcient code (Johnsson, 1984; Augustsson,1984). (Although it is obvious in retrospect, we had becomeused to the idea that laziness meant graph reduction, and graphreduction meant interpretation.)

•

Orwell, a lazy language developed by Wadler, inﬂuenced byKRC and Miranda, and OL, a later variant of Orwell. Bird andWadler co-authored an inﬂuential book on functional program-ming (Bird and Wadler, 1988), which avoided the “Tower of Babel” by using a more mathematical notation close to bothMiranda and Orwell.

•

Alﬂ, designed by Hudak, whose group at Yale developed acombinator-based interpreter for Alﬂ as well as a compilerbased on techniques developed for Scheme and for T (a dialectof Scheme) (Hudak, 1984b; Hudak, 1984a).

•

Id, a non-strict dataﬂow language developed at MIT by Arvindand Nikhil, whose target was a dataﬂow machine that they werebuilding.

•

Clean, a lazy language based explicitly on graph reduction,developed at Nijmegen by Rinus Plasmeijer and his colleagues(Brus et al., 1987).

•

Ponder, a language designed by Jon Fairbairn, with an impred-icative higher-rank type system and lexically scoped type vari-ables that was used to write an operating system for SKIM(Fairbairn, 1985; Fairbairn, 1982).

•

Daisy, a lazy dialect of Lisp, developed at Indiana by CordeliaHall,John O’Donnell,andtheircolleagues (HallandO’Donnell,1985).Withthenotable exceptionof Miranda (seeSection3.8),allof thesewere essentially single-sitelanguages, and each individually lackedcritical mass in terms of language-design effort, implementations,and users. Furthermore, although each had lots of interesting ideas,there were few reasons to claim that one language was demonstra-bly superior to any of the others. On the contrary, we felt that theywere all roughly the same, bar the syntax, and we started to wonderwhy we didn’t have a single, common language that we could allbeneﬁt from.At this time, both the Scheme and ML communities had developedtheir own standards. The Scheme community had major loci inMIT, Indiana, and Yale, and had just issued its ‘revised revised’report(Rees andClinger,1986) (subsequent revisions wouldleadtothe‘revised

(Milner andTofte, 1990; Milner et al., 1997)), and Appel and MacQueen hadreleased a new high-quality compiler for it (Appel and MacQueen,1987).

2.3 The birth of Haskell

By 1987, the situation was akin to a supercooled solution—all thatwas needed was a random event to precipitate crystallisation. Thatevent happened in the fall of ’87, when Peyton Jones stopped atYale to see Hudak on his way to the 1987 Functional Program-ming and Computer Architecture Conference (FPCA) in Portland,Oregon. After discussing the situation, Peyton Jones and Hudak decided to initiate a meeting during FPCA, to garner interest in de-signing a new, common functional language. Wadler also stoppedat Yale on the way to FPCA, and also endorsed the idea of a meet-ing.The FPCA meeting thus marked the beginning of the Haskell de-sign process, although we had no name for the language and veryfew technical discussions or design decisions occurred. In fact, akey point that came out of that meeting was that the easiest way tomove forward was to begin with an existing language, and evolve