"Some half dozen persons have written technically on combinatory logic, and most of these, including ourselves, have published something erroneous. Since some of our fellow sinners are among the most careful and competent logicians on the contemporary scene, we regard this as evidence that the subject is refractory. Thus fullness of exposition is necessary for accuracy; and excessive condensation would be false economy here, even more than it is ordinarily."
Haskell B. Curry and Robert Feys in the Preface to Combinatory Logic , May 31, 1956
In September of 1987 a meeting was held at the conference on Functional Programming Languages and Computer Architecture (FPCA '87) in Portland, Oregon, to discuss an unfortunate situation in the functional programming community: there had come into being more than a dozen non-strict, purely functional programming languages, all similar in expressive power and semantic underpinnings. There was a strong consensus at this meeting that more widespread use of this class of functional languages was being hampered by the lack of a common language. It was decided that a committee should be formed to design such a language, providing faster communication of new ideas, a stable foundation for real applications development, and a vehicle through which others would be encouraged to use functional languages. This document describes the result of that committee's efforts: a purely functional programming language called Haskell , named after the logician Haskell B. Curry whose work provides the logical basis for much of ours.
The committee's primary goal was to design a language that satisfied these constraints:
Haskell has evolved continuously since its orignal publication. By the middle of 1997, there had been four versions of the language (the latest at that point being Haskell 1.4). At the 1997 Haskell Workshop in Amsterdam, it was decided that a stable variant of Haskell was needed; this stable language is the subject of this Report, and is called "Haskell 98".
Haskell 98 was conceived as a relatively minor tidy-up of Haskell 1.4, making some simplifications, and removing some pitfalls for the unwary. It is intended to be a "stable" language in sense the implementors are committed to supporting Haskell 98 exactly as specified, for the foreseeable future.
As a separate exercise, Haskell will continue to evolve. At the time of writing there are Haskell implementations that support existential types, local universal polymorphism, rank-2 types, multi-parameter type classes, pattern guards, exceptions, concurrency, and more besides. Haskell 98 does not impede these developments. Instead, it provides a stable point of reference, so that those who wish to write text books, or use Haskell for teaching, can do so in the knowledge that Haskell 98 will continue to exist. On the few occasions when we refer to the evolving, future version of Haskell, we call it "Haskell 2".
This report is the official specification of Haskell 98 and should be suitable for writing programs and building implementations. It is not a tutorial on programming in Haskell such as the `Gentle Introduction' , so some familiarity with functional languages is assumed.
Haskell 98 is described in two separate documents: the Haskell Language Report (this document) and the Haskell Library Report .
For the benefit of those who have some knowledge of earlier version of Haskell, we briefly summarise the differences between Haskell 98 and its predecessors.
A complete list of the differences between Haskell 1.4 and Haskell 98 can be found at http://haskell.org. A summary of the main features is as follows:
Version 1.4 of the report made the following relatively minor changes to the language:
Version 1.3 of the report made the following substantial changes to the language:
The Haskell web site
gives access to many useful resources, including:
We heartily thank these people for their useful contributions to this report: Kris Aerts, Hans Aberg, Richard Bird, Stephen Blott, Tom Blenko, Duke Briscoe, Magnus Carlsson, Franklin Chen, Olaf Chitil, Chris Clack, Guy Cousineau, Tony Davie, Chris Dornan, Chris Fasel, Pat Fasel, Sigbjorn Finne, Andy Gill, Mike Gunter, Cordy Hall, Thomas Hallgren, Klemens Hemm, Bob Hiromoto, Nic Holt, Ian Holyer, Randy Hudson, Alexander Jacobson, Simon B. Jones, Stef Joosten, Mike Joy, Stefan Kahrs, Jerzy Karczmarczuk, Kent Karlsson, Richard Kelsey, Siau-Cheng Khoo, Amir Kishon, Jose Labra, Jeff Lewis, Mark Lillibridge, Sandra Loosemore, Olaf Lubeck, Simon Marlow, Jim Mattson, Sergey Mechveliani, Randy Michelsen, Rick Mohr, Arthur Norman, Nick North, Bjarte M. Ostvold, Paul Otto, Sven Panne, Dave Parrott, Larne Pekowsky, Rinus Plasmeijer, Ian Poole, Stephen Price, John Robson, Andreas Rossberg, Patrick Sansom, Felix Schroeter, Christian Sievers, Libor Skarvada, Jan Skibinski, Lauren Smith, Raman Sundaresh, Satish Thatte, Simon Thompson, Tom Thomson, David Tweed, Pradeep Varma, Malcolm Wallace, Keith Wansbrough, Tony Warnock, Carl Witty, Stuart Wray, and Bonnie Yantis.
We are especially grateful to past members of the Haskell committee --- Arvind, Jon Fairbairn, Andy Gordon, Maria M. Guzman, Dick Kieburtz, Rishiyur Nikhil, Mike Reeve, David Wise, and Jonathan Young --- for the major contributions they have made to previous versions of this report. We also thank those who have participated in the lively discussions about Haskell on the FP and Haskell mailing lists.
Finally, aside from the important foundational work laid by Church, Rosser, Curry, and others on the lambda calculus, we wish to acknowledge the influence of many noteworthy programming languages developed over the years. Although it is difficult to pinpoint the origin of many ideas, we particularly wish to acknowledge the influence of Lisp (and its modern-day incarnations Common Lisp and Scheme); Landin's ISWIM; APL; Backus's FP ; ML and Standard ML; Hope and Hope+; Clean; Id; Gofer; Sisal; and Turner's series of languages culminating in Miranda. (Miranda is a trademark of Research Software Ltd.) Without these forerunners Haskell would not have been possible.