All Topics  
Haskell (programming language)

 
Haskell (programming Language)

   Email Print
   Bookmark   Link






 

Haskell (programming language)



 
 
Haskell is a standardized, purely functional
Purely functional

Purely functional is a term in computing used to describe algorithms, data structures or programming languages that exclude destructive modifications ....
 programming language
Programming language

A programming language is a machine-readable artificial language designed to express computations that can be performed by a machine, particularly a computer....
 with non-strict semantics, named after logician Haskell Curry
Haskell Curry

Haskell Brooks Curry was an United States mathematician and logician. Curry is best known for his work in combinatory logic; while the initial concept of combinatory logic was based on a single paper by Moses Sch?nfinkel, much of the development was done by Curry....
. The goals of the language are described as:
owing the release of Miranda
Miranda programming language

Miranda is a lazy evaluation purely functional programming programming language designed by David Turner as a successor to his earlier programming languages SASL programming language and KRC, using some concepts from ML and Hope ....
 by Research Software Ltd, in 1985, interest in lazy functional languages grew. By 1987, more than a dozen non-strict, purely functional programming languages existed. Of these, Miranda was the most widely used, but was not in the public domain.






Discussion
Ask a question about 'Haskell (programming language)'
Start a new discussion about 'Haskell (programming language)'
Answer questions from other users
Full Discussion Forum



Recent Posts









Encyclopedia


Haskell is a standardized, purely functional
Purely functional

Purely functional is a term in computing used to describe algorithms, data structures or programming languages that exclude destructive modifications ....
 programming language
Programming language

A programming language is a machine-readable artificial language designed to express computations that can be performed by a machine, particularly a computer....
 with non-strict semantics, named after logician Haskell Curry
Haskell Curry

Haskell Brooks Curry was an United States mathematician and logician. Curry is best known for his work in combinatory logic; while the initial concept of combinatory logic was based on a single paper by Moses Sch?nfinkel, much of the development was done by Curry....
. The goals of the language are described as:

History

Following the release of Miranda
Miranda programming language

Miranda is a lazy evaluation purely functional programming programming language designed by David Turner as a successor to his earlier programming languages SASL programming language and KRC, using some concepts from ML and Hope ....
 by Research Software Ltd, in 1985, interest in lazy functional languages grew. By 1987, more than a dozen non-strict, purely functional programming languages existed. Of these, Miranda was the most widely used, but was not in the public domain. At the conference on Functional Programming Languages and Computer Architecture (FPCA '87) in Portland, Oregon
Portland, Oregon

Portland is a city located in the Northwestern United States United States, near the confluence of the Willamette River and Columbia River rivers in the state of Oregon....
, a meeting was held during which participants formed a strong consensus that a committee should be formed to define an open standard
Open standard

An open standard is a standard that is publicly available and has various rights to use associated with it, and various properties of how it was designed....
 for such languages. The committee's purpose was to consolidate the existing functional languages into a common one that would serve as a basis for future research in functional-language design. The first version of Haskell ("Haskell 1.0") was defined in 1990. The committee's efforts resulted in a series of language definitions. In late 1997, the series culminated in Haskell 98, intended to specify a stable, minimal, portable version of the language and an accompanying standard library
Library (computer science)

In computer science, a library is a collection of subroutines or Class used to develop software. Libraries contain code and data that provide services to independent programs....
 for teaching, and as a base for future extensions. The committee expressly welcomed the creation of extensions and variants of Haskell 98 via adding and incorporating experimental features.

In January 1999, the Haskell 98 language standard was originally published as "The Haskell 98 Report". In January 2003, a revised version was published as "Haskell 98 Language and Libraries: The Revised Report". The language continues to evolve rapidly, with the GHC
Glasgow Haskell Compiler

The Glorious Glasgow Haskell Compilation System, more commonly known as the Glasgow Haskell Compiler or GHC, is an open source Machine language compiler for the functional programming Computer programming Programming language Haskell ....
 implementation representing the current de facto standard. In early 2006, the process of defining a successor to the Haskell 98 standard, informally named Haskell′ ("Haskell Prime"), was begun. This process is intended to produce a minor revision of Haskell 98.

Features and extensions

Characteristic features of Haskell include pattern matching
Pattern matching

In computer science, pattern matching is the act of checking for the presence of the constituents of a given pattern. In contrast to pattern recognition, the pattern is rigidly specified....
, currying
Currying

In computer science, currying, invented by Moses Sch?nfinkel and Gottlob Frege, and independently by Haskell Curry, is the technique of transforming a function that takes multiple parameter in such a way that it can be called as a chain of functions each with a single argument....
, list comprehension
List comprehension

A list comprehension is a Syntax of programming languages construct available in some programming languages for creating a list based on existing lists....
s , guard
Guard (computing)

In computer programming, a guard is a Boolean datatype expression that must evaluate to true if the program execution is to continue in the branch in question....
s, definable operator
Operator (programming)

Programming languages generally support a set of operators that are similar to operator. A language may contain a fixed number of built-in operators or it may allow the creation of programmer-defined operators ....
s, and single assignment
Single assignment

Single assignment is used to describe a computer programming programming language or representation in which one cannot bind a value to a name if a value has already been bound to that name....
. The language also supports recursive
Recursion

Recursion, in mathematics and computer science, is a method of defining Function in which the function being defined is applied within its own definition....
 functions and algebraic data type
Algebraic data type

In computer programming, an algebraic data type is a datatype each of whose value s is data from other datatypes wrapped in one of the constructors of the datatype....
s, as well as lazy evaluation
Lazy evaluation

In computer programming, lazy evaluation is the technique of delaying a computation until such time as the result of the computation is known to be needed....
. Unique concepts include monad
Monads in functional programming

In functional programming, a monad is a kind of abstract data type used to represent computations . Programs written in functional style can make use of monads to structure procedures that include sequenced operations, or to define arbitrary control flows ....
s, and type class
Type class

In computer science, a type class is a type system construct that supports Type polymorphism#Ad-hoc polymorphism. This is achieved by adding constraints to type variables in Parametric polymorphism#Parametric polymorphism types....
es. The combination of such features can make functions which would be difficult to write in a procedural programming language almost trivial to implement in Haskell.

Several variants have been developed: parallelizable versions from MIT
Massachusetts Institute of Technology

The Massachusetts Institute of Technology is a private university research university located in Cambridge, Massachusetts, Massachusetts, United States....
 and Glasgow University, both called Parallel Haskell; more parallel and distributed versions called Distributed Haskell (formerly Goffin) and Eden; a speculatively evaluating
Speculative execution

In computer science, speculative execution is the execution of Code , the result of which may not be needed. In the context of functional programming, the term "speculative evaluation" is used instead....
 version called Eager Haskell
Eager Haskell

Eager Haskell is an implementation of the Haskell programming language that uses eager evaluation.Sources and External Links ...
 and several object oriented versions: Haskell++, O'Haskell
O'Haskell

O'Haskell is an object-oriented, concurrent programming extension of the functional programming language Haskell . It was developed at OGI School of Science and Engineering and Chalmers University of Technology....
 and Mondrian
Mondrian programming language

The Mondrian programming language is a scripting language developed by Utrecht University for use with Internet applications. It is considered as a mixture of Haskell and Java ....
.

Concurrent Clean is a close relative of Haskell, whose biggest deviation from Haskell is in the use of uniqueness type
Uniqueness type

In computing, a unique type guarantees that an object is used in a single-threaded way, with at most a single reference to it. If a value has a unique type, a function applied to it can be made to update the value in-place in the object code....
s for input instead of monads
Monads in functional programming

In functional programming, a monad is a kind of abstract data type used to represent computations . Programs written in functional style can make use of monads to structure procedures that include sequenced operations, or to define arbitrary control flows ....
.

Applications

Haskell is increasingly being used in commercial situations. Audrey Tang
Audrey Tang

Audrey Tang is a Taiwanese people free software programmer, who has been described as one of the "ten greats of Taiwanese computing."...
's Pugs
Pugs

Pugs is a compiler and interpreter for the Perl 6 programming language, started on February 1 2005 by Audrey Tang....
 is an implementation for the long-forthcoming Perl 6
Perl 6

Perl 6 is a planned major revision to the Perl programming language. It is a language specification which introduces elements of many modern and historical languages....
 language with an interpreter and compilers that proved useful after just a few months of its writing; similarly, GHC is often a testbed for advanced functional programming features and optimizations. Darcs
Darcs

Darcs is a distributed revision control system by David Roundy that was designed to replace traditional centralized source control systems such as Concurrent Versions System and Subversion ....
 is a revision control system, with several innovative features. Linspire
Linspire

Linspire, previously known as LindowsOS, was a commercial operating system based on Debian and later Ubuntu. Linspire was published by Linspire, Inc....
 GNU/Linux chose Haskell for system tools development. Xmonad
Xmonad

xmonad is a tiling window manager for the X Window System, written in the Functional programming Haskell .Begun in March 2007, it is similar to dwm, larswm, Stumpwm and other members of the tiling window manager family, in that it strives to make it possible for the user to productively manage windows without the use of the Mouse ....
 is a window manager
Window manager

A window manager is computer software that controls the placement and appearance of window within a windowing system in a graphical user interface....
 for the X Window System
X Window System

The X Window System is a computing software system and network protocol that provides a graphical user interface for networked computers. It implements the X Window System protocols and architecture and provides windowing system on raster graphics Visual display units and manages Keyboard and pointing device control functions....
, written entirely in Haskell. Bluespec SystemVerilog is a language for semiconductor design that is an extension of Haskell. Additionally, Bluespec, Inc.
Bluespec, Inc.

Bluespec, Inc. is a semiconductor tool design company co-founded by prof. Arvind of MIT in June 2003. Arvind had previously founded Sandburst in 2000, which specialized in producing chips for 10 gigabit Ethernet routers; for this task, Arvind had developed the Bluespec language, a high-level functional programming hardware description langua...
's tools are implemented in Haskell.

Examples

A simple example that is often used to demonstrate the syntax of functional languages is the factorial
Factorial

In mathematics, the factorial of a negative and non-negative numbers integer n, denoted by n!, is the Product of all positive integers less than or equal to n....
 function for non-negative integers, shown in Haskell:

factorial Integer -> Integer factorial 0 = 1 factorial n | n > 0 = n * factorial (n-1)

Or in one line:

factorial n = if n > 0 then n * factorial (n-1) else 1

This describes the factorial as a recursive function, with one terminating base case. It is similar to the descriptions of factorials found in mathematics textbooks. Much of Haskell code is similar to standard mathematical notation in facility and syntax.

The first line of the factorial function describes the types of this function; while it is optional, it is considered to be good style to include it. It can be read as the function factorial (factorial) has type () from integer to integer (Integer -> Integer). That is, it takes an integer as an argument, and returns another integer. The type of a definition is inferred automatically if the programmer didn't supply a type annotation.

The second line relies on pattern matching
Pattern matching

In computer science, pattern matching is the act of checking for the presence of the constituents of a given pattern. In contrast to pattern recognition, the pattern is rigidly specified....
, an important feature of Haskell. Note that parameters of a function are not in parentheses but separated by spaces. When the function's argument is 0 (zero) it will return the integer 1 (one). For all other cases the third line is tried. This is the recursion
Recursion

Recursion, in mathematics and computer science, is a method of defining Function in which the function being defined is applied within its own definition....
, and executes the function again until the base case is reached.

A guard
Guard (computing)

In computer programming, a guard is a Boolean datatype expression that must evaluate to true if the program execution is to continue in the branch in question....
 protects the third line from negative numbers for which a factorial is undefined. Without the guard this function would recurse through all negative numbers without ever reaching the base case of 0. As it is, the pattern matching is not complete: if a negative integer is passed to the fac function as an argument, the program will fail with a runtime error. A final case could check for this error condition and print an appropriate error message instead.

The "Prelude" is a number of small functions analogous to C
C (programming language)

C is a general-purpose computer programming language originally developed in 1972 by Dennis Ritchie at the Bell Telephone Laboratories to implement the Unix operating system....
's standard library
C standard library

The C standard library consists of a set of sections of the ISO C standard which describe a collection of header files and library routines used to implement common operations, such as input/output and character string handling, in the C ....
. Using the Prelude, we can express the factorial function as:

fac n = product (enumFromTo 1 n)

As the name n does not really contribute to the clarity of the function, this function might be better expressed in the point-free style of unspecified arguments. Using the function composition operator (expressed as a dot in Haskell) to compose the product function with the curried
Currying

In computer science, currying, invented by Moses Sch?nfinkel and Gottlob Frege, and independently by Haskell Curry, is the technique of transforming a function that takes multiple parameter in such a way that it can be called as a chain of functions each with a single argument....
 enumeration function, it becomes:

fac = product . enumFromTo 1

In the Hugs interpreter, you often need to define the function and use it on the same line separated by a where or let..in, meaning you need to enter this to test the above examples and see the output 120: let in fac 5 or fac 5 where fac = product . enumFromTo 1

The GHCi interpreter doesn't have this restriction and function definitions can be entered on one line and referenced later.

More complex examples

A simple Reverse Polish Notation
Reverse Polish notation

Reverse Polish notation by analogy with the related Polish notation, a prefix notation introduced in 1920 by the Poland mathematician Jan Lukasiewicz, is a mathematical notation wherein every operator follows all of its operands....
 calculator expressed with the higher-order function
Higher-order function

In mathematics and computer science, higher-order functions or functional are function s which do at least one of the following:*take one or more functions as an input...
 foldl whose argument f is defined in a where clause using pattern matching
Pattern matching

In computer science, pattern matching is the act of checking for the presence of the constituents of a given pattern. In contrast to pattern recognition, the pattern is rigidly specified....
 and the type class
Type class

In computer science, a type class is a type system construct that supports Type polymorphism#Ad-hoc polymorphism. This is achieved by adding constraints to type variables in Parametric polymorphism#Parametric polymorphism types....
 Read: calc String -> [Float] calc = foldl f [] . words where f (x:y:zs) "+" = (y + x):zs f (x:y:zs) "-" = (y - x):zs f (x:y:zs) "*" = (y * x):zs f (x:y:zs) "/" = (y / x):zs f xs y = read y : xs

The empty list is the initial state, and f interpret
Interpreter (computing)

In computer science, an interpreter normally means a computer program that execution , i.e. performs, instructions written in a programming language....
s one word at a time, either matching two numbers from the head of the list and pushing the result back in, or parsing the word as a floating-point number and prepending it to the list.

The following definition produces the list of Fibonacci numbers in linear time:

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

The infinite list is produced by corecursion
Corecursion

In computer science, corecursion is a type of operation that is dual to recursion. Corecursion is typically used to generate infinite data structures....
 — the latter values of the list are computed on demand starting from the initial two items 0 and 1. This kind of a definition relies on lazy evaluation
Lazy evaluation

In computer programming, lazy evaluation is the technique of delaying a computation until such time as the result of the computation is known to be needed....
, an important feature of Haskell programming. For an example of how the evaluation evolves, the following illustrates the values of fibs and tail fibs after the computation of six items and shows how zipWith (+) has produced four items and proceeds to produce the next item:

fibs = 0 : 1 : 1 : 2 : 3 : 5 : ... + + + + + + tail fibs = 1 : 1 : 2 : 3 : 5 : ... = = = = = = zipWith ... = 1 : 2 : 3 : 5 : 8 : ... fibs = 0 : 1 : 1 : 2 : 3 : 5 : 8 : ...

The same function, written using GHC's parallel list comprehension syntax (GHC extensions must be enabled using a special command-line flag '-fglasgow-exts'; see GHC's manual for more):

fibs = 0 : 1 : [ a+b | a <- fibs | b <- tail fibs ]

The factorial we saw previously can be written as a sequence of functions:

fac n = (foldl (.) id [\x -> x*k | k <- [1..n]]) 1

A remarkably concise function that returns the list of Hamming numbers in order:

hamming = 1 : map (2*) hamming `merge` map (3*) hamming `merge` map (5*) hamming where merge (x:xs) (y:ys) | x < y = x : xs `merge` (y:ys) | x > y = y : (x:xs) `merge` ys | otherwise = x : xs `merge` ys

Like the various fibs solutions displayed above, this uses corecursion to produce a list of numbers on demand, starting from the base case of 1 and building new items based on the preceding part of the list.

In this case the producer merge is defined in a where clause and used as an operator by enclosing it in back-quotes.

The branches of the guards define how merge merges two ascending lists into one ascending list without duplicate items.

Monads and Input/Output

As Haskell is a pure functional language, functions cannot have side effects. This is a challenge for real programs, which among other things need to interact with an environment. Haskell solves this with monadic types that leverages the type system to ensure the proper sequencing of imperative constructs. The typical example is I/O, but monads are useful for many other purposes, including mutable state, concurrency and transactional memory, exception handling, and error propagation.

Haskell provides a special syntax for monadic expressions, so that side-effecting programs can be written in a style similar to current imperative programming languages; no knowledge of the mathematics behind monadic I/O
Monad (category theory)

In category theory, a monad or triple is an functor, together with two associated natural transformations. They are important in the theory of pairs of adjoint functors, and they generalize closure operators on posets to arbitrary categories....
 is required for this. The following program reads a name from the command line and outputs a greeting message:

main = do putStrLn "What's your name?" name <- getLine putStr ("Hello, " ++ name ++ "!\n")

The do-notation eases working with monads. This do-expression is equivalent to, but (arguably) easier to write and understand than, the de-sugared version employing the monadic operators directly:

main = putStrLn "What's your name?" >> getLine >>= \ name -> putStr ("Hello, " ++ name ++ "!\n")

See also wikibooks:Transwiki:List of hello world programs#Haskell for another example that prints text.


Criticism

Jan-Willem Maessen, in 2002, and Simon Peyton Jones
Simon Peyton Jones

Simon Peyton Jones is a British computer scientist who researches the implementation and application software of functional programming languages, particularly lazy evaluation....
, in 2003, discussed problems associated with lazy evaluation while also acknowledging the theoretical motivation for it, in addition to purely practical considerations such as improved performance. They note that, in addition to adding some performance overhead, laziness makes it more difficult for programmers to reason about the performance of their code (specifically with regard to memory usage).

Bastiaan Heeren, Daan Leijen, and Arjan van IJzendoorn in 2003 also observed some stumbling blocks for Haskell learners, "The subtle syntax and sophisticated type system of Haskell are a double edged sword — highly appreciated by experienced programmers but also a source of frustration among beginners, since the generality of Haskell often leads to cryptic error messages." To address these, they developed an advanced interpreter called Helium
Helium (Haskell)

Helium is a compiler and a dialect of the Functional programming Haskell . It has been designed to make learning Haskell easier by giving clearer error messages....
 which improved the user-friendliness of error messages by limiting the generality of some Haskell features, and in particular removing support for type classes.

Implementations

The following all comply fully, or very nearly, with the Haskell 98 standard, and are distributed under open source
Open source

Open source is an approach to design, development, and distribution offering practical accessibility to a product's source . Some consider open source as one of various possible design approaches, while others consider it a critical Strategy element of their business operations....
 licenses. There are currently no proprietary Haskell implementations.

  • The Glasgow Haskell Compiler
    Glasgow Haskell Compiler

    The Glorious Glasgow Haskell Compilation System, more commonly known as the Glasgow Haskell Compiler or GHC, is an open source Machine language compiler for the functional programming Computer programming Programming language Haskell ....
     (GHC) compiles to native code on a number of different architectures—as well as to ANSI C
    ANSI C

    ANSI C is the standard published by the American National Standards Institute for the C . Software developers writing in C are encouraged to conform to the requirements in the document, as it encourages easily porting code....
    —using C--
    C--

    C-- is a C -like programming language. Its creators, functional programming researchers Simon Peyton Jones and Norman Ramsey , designed it to be generated mainly by compilers for very high-level languages rather than written by human programmers....
     as an intermediate language
    Intermediate language

    In computer science, an intermediate language is the language of an abstract machine designed to aid in the analysis of computer programs. The term comes from their use in compilers, where a compiler first translates the source code of a program into a form more suitable for code-improving transformations, as an intermediate step before gener...
    . GHC is probably the most popular Haskell compiler, and there are quite a few useful libraries (e.g. bindings to OpenGL
    OpenGL

    OpenGL is a standard specification defining a cross-language cross-platform Application programming interface for writing applications that produce 2D computer graphics and 3D computer graphics....
    ) that will work only with GHC.
  • Gofer
    Gofer (software)

    Gofer is an implementation of the programming language Haskell intended for educational purposes and supporting a language based on version 1.2 of the Haskell report....
     was an educational dialect of Haskell, with a feature called "constructor classes", developed by Mark Jones. It was supplanted by Hugs (see below).
  • is another native-code Haskell compiler. It has not been actively developed for some time but is still usable.
  • Helium
    Helium (Haskell)

    Helium is a compiler and a dialect of the Functional programming Haskell . It has been designed to make learning Haskell easier by giving clearer error messages....
     is a newer dialect of Haskell. The focus is on making it easy to learn by providing clearer error messages. It currently lacks typeclasses, rendering it incompatible with many Haskell programs.
  • Hugs
    Hugs

    Hugs is a Byte-code Interpreter for the functional programming programming language Haskell . Hugs is the successor to Gofer , and was originally derived from Gofer version 2.30b....
    , the Haskell User's Gofer System, is a bytecode
    Bytecode

    Bytecode is a term which has been used to denote various forms of instruction sets designed for efficient execution by a software Interpreter as well as being suitable for further compilation into machine language....
     interpreter. It offers fast compilation of programs and reasonable execution speed. It also comes with a simple graphics library. Hugs is good for people learning the basics of Haskell, but is by no means a "toy" implementation. It is the most portable and lightweight of the Haskell implementations.
  • is a Haskell compiler written by John Meacham emphasising speed and efficiency of generated programs as well as exploration of new program transformations. LHC, is a recent fork of Jhc.
  • is another bytecode compiler, but the bytecode runs significantly faster than with Hugs. Nhc98 focuses on minimizing memory usage, and is a particularly good choice for older, slower machines.
  • Yhc
    Yhc

    The University of York Haskell Compiler is an open source bytecode compiler for the functional programming programming language Haskell ; it primarily targets the Haskell '98 standard....
    , the York Haskell Compiler is a fork of nhc98, with the goals of being simpler, more portable and more efficient, and integrating support for , the Haskell tracer. It also features a JavaScript
    JavaScript

    JavaScript is a scripting language widely used for client-side web development. It was the originating Programming language dialect of the ECMAScript standard....
     backend allowing users to run .


Libraries


Since January 2007, libraries and applications written in Haskell have been collected on "", an online database of open source Haskell software using Cabal
Cabal (software)

The Haskell Cabal is is the Common Architecture for Building Application software and Library ; it aids in the packaging and distribution of Software package ....
 packaging tool. By February 2009 there were some available.

Hackage provides a central point for the distribution of Haskell software, via Cabal, and has become a hub for new Haskell development activity. Installing new Haskell software via Hackage is possible via the cabal-install tool:

$ cabal install xmonad

which recursively installs required dependencies if they are available on Hackage. This makes installation of Haskell code easier than had been possible previously.

See also

  • O'Haskell
    O'Haskell

    O'Haskell is an object-oriented, concurrent programming extension of the functional programming language Haskell . It was developed at OGI School of Science and Engineering and Chalmers University of Technology....
     — an extension of Haskell adding object-orientation
    Object-oriented programming

    Object-oriented programming is a programming paradigm that uses "Object_" and their interactions to design applications and computer programs....
     and concurrent programming support.
  • Pugs
    Pugs

    Pugs is a compiler and interpreter for the Perl 6 programming language, started on February 1 2005 by Audrey Tang....
     — a compiler and interpreter for the Perl 6
    Perl 6

    Perl 6 is a planned major revision to the Perl programming language. It is a language specification which introduces elements of many modern and historical languages....
     programming language
  • LOLITA
    LOLITA

    LOLITA is a natural language processing system developed by Durham University between 1986 and 2000. The name is an acronym for "Large-scale, Object-based, Linguistics Interactor, Machine translation and Analyzer"....
     and Darcs
    Darcs

    Darcs is a distributed revision control system by David Roundy that was designed to replace traditional centralized source control systems such as Concurrent Versions System and Subversion ....
     — large applications written in Haskell
  • Xmonad
    Xmonad

    xmonad is a tiling window manager for the X Window System, written in the Functional programming Haskell .Begun in March 2007, it is similar to dwm, larswm, Stumpwm and other members of the tiling window manager family, in that it strives to make it possible for the user to productively manage windows without the use of the Mouse ....
     — a window manager written in Haskell (under 1200 lines)
  • Jaskell — a functional scripting programming language that runs in Java VM
  • Curry — a language based on Haskell
  • House
    House (operating system)

    House is an Acronym and initialism for the Haskell User's Operating System and Environment. It is an experimental operating system written in Haskell ....
     — an operating system written using Haskell
  • WinHugs — Haskell compiler for Windows


External links

  • - The Haskell Home Page
  • - History of Haskell
  • (a PostScript file)
  • - a slightly humorous overview of different programming styles available in Haskell


Tutorials

  • - a comprehensive book for beginners to experts, published under a Creative Commons
    Creative Commons

    Creative Commons is a non-profit organization devoted to expanding the range of creativity works available for others to build upon legally and to share....
     license
  • - an Haskell tutorial by Hal Daume III; assumes much less prior knowledge than the official tutorial
  • (a more advanced tutorial, also available as )
  • by Eric Etheridge
  • - a humorous tutorial with illustrations