Personal tools

Haskell in 5 steps

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(point to haskell.es)
(Write your first parallel Haskell program)
 
(27 intermediate revisions by 16 users not shown)
Line 6: Line 6:
 
== Install Haskell ==
 
== Install Haskell ==
   
Haskell, like most other languages, comes in two flavors: batch oriented
+
The recommended way to get started with programming Haskell is the [http://hackage.haskell.org/platform/ Haskell Platform]. The Platform comes with GHC, the de-facto standard Haskell compiler, with many useful tools that will let you program Haskell painlessly. The installation should be easy and simple enough on most operating systems.
(''compiler'') and interactive (''interpreter''). An interactive system
 
gives you a command line where you can experiment and evaluate
 
expressions directly, and is probably a good choice to start with.
 
   
{| class="wikitable"
+
[http://tryhaskell.org/ Try Haskell] provides a less complete but quicker way to give Haskell a shot.
|[http://www.haskell.org/ghc/ GHC]
 
|Compiler and interpreter (GHCi)
 
|Probably the most feature-complete system
 
|-
 
|[http://www.haskell.org/hugs/ Hugs]
 
|Interpreter only
 
|Very portable, and more lightweight than GHC.
 
|}
 
 
While both GHC and Hugs work on Windows, Hugs has perhaps the best
 
integration on that platform. There is also information available on
 
[[Mac OS X|installing Haskell software on Mac OS X]].
 
   
 
== Start Haskell ==
 
== Start Haskell ==
   
Open a terminal. If you installed GHC type '''ghci''' (the GHC
+
If you have installed the Haskell Platform, open a terminal and type '''ghci''' (the name of the executable of the GHC interpreter) at the command prompt. Alternatively, if you are on Windows, you may choose '''WinGHCi''' in the Start menu.
interpreter). If you installed Hugs type '''hugs'''.
 
   
 
<pre>
 
<pre>
 
$ ghci
 
$ ghci
___ ___ _
+
GHCi, version 6.12.3: http://www.haskell.org/ghc/ :? for help
/ _ \ /\ /\/ __(_)
+
Loading package base ... linking ... done.
/ /_\// /_/ / / | | GHC Interactive, version 6.4, for Haskell 98.
 
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
 
\____/\/ /_/\____/|_| Type :? for help.
 
 
Loading package base-1.0 ... linking ... done.
 
 
Prelude>
 
Prelude>
 
</pre>
 
</pre>
Line 117: Line 117:
   
 
'''Great!'''
 
'''Great!'''
  +
  +
===Write your first parallel Haskell program===
  +
  +
Haskell has good support for parallel and multicore programming. We can write a parallel program by adding `par` to expressions, like so:
  +
  +
<haskell>
  +
import Control.Parallel
  +
  +
main = a `par` b `par` c `pseq` print (a + b + c)
  +
where
  +
a = ack 3 10
  +
b = fac 42
  +
c = fib 34
  +
  +
fac 0 = 1
  +
fac n = n * fac (n-1)
  +
  +
ack 0 n = n+1
  +
ack m 0 = ack (m-1) 1
  +
ack m n = ack (m-1) (ack m (n-1))
  +
  +
fib 0 = 0
  +
fib 1 = 1
  +
fib n = fib (n-1) + fib (n-2)
  +
</haskell>
  +
  +
Compiling with -threaded and optimizations on:
  +
  +
<pre>
  +
$ ghc -O2 --make A.hs -threaded -rtsopts
  +
[1 of 1] Compiling Main ( A.hs, A.o )
  +
Linking A ...
  +
</pre>
  +
  +
''Note that in versions of GHC prior to GHC 7, you can leave off the -rtsopts flag''
  +
  +
And now we can run our multicore program. Here across two cores:
  +
  +
<pre>
  +
$ time ./A +RTS -N2
  +
1405006117752879898543142606244511569936384005711076
  +
./A +RTS -N2 2.14s user 0.02s system 149% cpu 1.449 total
  +
</pre>
  +
  +
Congratulations! You are now programming your multicore!
   
 
== Where to go from here ==
 
== Where to go from here ==
Line 123: Line 168:
   
 
'''Tutorials'''
 
'''Tutorials'''
* [http://www.cs.utah.edu/~hal/docs/daume02yaht.pdf Yet Another Haskell Tutorial] (English)
+
* [http://book.realworldhaskell.org/ Real World Haskell]
* [ftp://ftp.geoinfo.tuwien.ac.at/navratil/HaskellTutorial.pdf Haskell-Tutorial] (English)
+
* [[Learn_Haskell_in_10_minutes|Haskell in 10 minutes]]
* [http://www.haskell.org/tutorial/ A Gentle Introduction to Haskell] (English)
+
* [http://darcs.haskell.org/yaht/yaht.pdf Yet Another Haskell Tutorial] (English)
* [http://www.informatik.uni-bonn.de/~ralf/teaching/Hskurs_toc.html Haskell Kurs] (Deutsch)
+
* [http://www.haskell.org/tutorial/ A Gentle Introduction to Haskell] (English, [[Image:GentleFR.pdf|French PDF]])
* [[Haskell.es]] (Spanish)
+
* [http://learnyouahaskell.com/ Learn You A Haskell For Great Good!]
   
'''Courses'''
+
For a complete list of textbooks, references and tutorials:
* [http://www.cs.chalmers.se/Cs/Grundutb/Kurser/d1pt/d1pta/external.html Programming in Haskell] (English)
 
* Functional programming ([http://www.cs.uu.nl/~jeroen/courses/fp-eng.pdf English], [http://www.cs.uu.nl/~jeroen/courses/fp-sp.pdf Español], [http://www.cs.uu.nl/~jeroen/courses/fp-nl.pdf Netherlands]) (Note, that this uses an old version of Haskell; e.g. input/output has changed since then)
 
   
'''References'''
+
* [[Books and tutorials]]
* [http://www.cs.uu.nl/~afie/haskell/tourofsyntax.html Tour of Haskell Syntax] ([http://cs.anu.edu.au/Student/comp1100/haskell/tourofsyntax.html this link seems to work])
 
* [http://zvon.org/other/haskell/Outputglobal/index.html Haskell Reference]
 
* [http://www.cs.uu.nl/~afie/haskell/tourofprelude.html Tour of the Haskell Prelude] ([http://www.comp.nus.edu.sg/~sulzmann/courses/melbourne/sem2002-1/141/www/tourofprelude.html this link seems to work])
 
* [http://members.chello.nl/hjgtuyl/tourdemonad.html A tour of the Haskell Monad functions]
 
   
'''Textbooks'''
+
'''Join the community!'''
* [http://www.haskell.org/soe The Haskell School of Expression]
 
* [http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e/ Haskell: The Craft of Functional Programming]
 
* [http://www.prenhall.com/allbooks/ptr_0134843460.html Introduction to Functional Programming using Haskell]
 
* [http://books.cambridge.org/0521277248.htm An Introduction to Functional Programming Systems Using Haskell]
 
* [http://www.iro.umontreal.ca/~lapalme/Algorithms-functional.html Algorithms: A functional programming approach]
 
* [http://homepages.cwi.nl/~jve/HR/ The Haskell Road to Logic, Maths and Programming]
 
   
For more, see [[Learning Haskell]] and [[Books and tutorials]].
+
Talk to others in the Haskell [[User_groups|community]].
 
'''Getting help'''
 
 
If you have questions, join the [http://haskell.org/mailman/listinfo/haskell-cafe Haskell-Cafe mailing list] or the [[IRC channel]] and ask. You can also ask questions here on the wiki, see [[Questions and answers]].
 
Information about Haskell support for various operating systems is [http://www.haskell.org/haskellwiki/Category:OS here].
 
   
 
[[Category:Tutorials]]
 
[[Category:Tutorials]]
  +
  +
Languages: [[Haskell in 5 Schritten|de]] [[5 adımda Haskell|tur]] [[Cn/Haskell 入门五步走|zh/cn]] [[Tw/Haskell入門的5個步驟|zh/tw]] [[Haskell入門 5ステップ|ja]]

Latest revision as of 18:00, 26 April 2011

Haskell is a general purpose, purely functional programming language. This page will help you get started as quickly as possible.

Contents


[edit] 1 Install Haskell

The recommended way to get started with programming Haskell is the Haskell Platform. The Platform comes with GHC, the de-facto standard Haskell compiler, with many useful tools that will let you program Haskell painlessly. The installation should be easy and simple enough on most operating systems.

Try Haskell provides a less complete but quicker way to give Haskell a shot.

[edit] 2 Start Haskell

If you have installed the Haskell Platform, open a terminal and type ghci (the name of the executable of the GHC interpreter) at the command prompt. Alternatively, if you are on Windows, you may choose WinGHCi in the Start menu.

    $ ghci
    GHCi, version 6.12.3: http://www.haskell.org/ghc/  :? for help
    Loading package base ... linking ... done.
    Prelude>

And you are presented with a prompt. The Haskell system now attentively awaits your input.

[edit] 3 Write your first Haskell program

If you've learned to program another language, your first program probably was "Hello, world!", so let's do that:

Prelude> "Hello, World!"
"Hello, World!"

The Haskell system evaluated the string, and printed the result. Or we can try a variation to print directly to standard output:

Prelude> putStrLn "Hello World"
Hello World

Using a Haskell compiler, such as GHC, you can compile the code to a standalone executable. Create a source file hello.hs containing:

main = putStrLn "Hello, World!"

And compile it with:

    $ ghc -o hello hello.hs

You can then run the executable (./hello on Unix systems, hello.exe on Windows):

    $ ./hello
    Hello, World!

[edit] 4 Haskell the calculator

Let's do something fun. In Haskell, your first true program is the factorial function. So back to the interpreter now and let's define it:

Prelude> let fac n = if n == 0 then 1 else n * fac (n-1)

This defines a new function called fac which computes the factorial of an integer.

We can now run fac on some argument:

Prelude> fac 42
1405006117752879898543142606244511569936384000000000

Congratulations! Programming made easy. Note that if you're using Hugs, you'll need to load the definition of fac from a file, fac.hs, containing:

fac n = if n == 0 then 1 else n * fac (n-1)

And run it with Hugs as follows (this also works in GHCi):

Hugs.Base> :load fac.hs
Main> fac 42
1405006117752879898543142606244511569936384000000000

We can of course compile this program, to produce a standalone executable. In the file fac.hs we can write (and let's use elegant pattern matching syntax just for fun):

fac 0 = 1
fac n = n * fac (n-1)
 
main = print (fac 42)

which can then be compiled and run:

    $ ghc -o fac fac.hs
    $ ./fac
    1405006117752879898543142606244511569936384000000000

Great!

[edit] 4.1 Write your first parallel Haskell program

Haskell has good support for parallel and multicore programming. We can write a parallel program by adding `par` to expressions, like so:

import Control.Parallel
 
main = a `par` b `par` c `pseq` print (a + b + c)
    where
        a = ack 3 10
        b = fac 42
        c = fib 34
 
fac 0 = 1
fac n = n * fac (n-1)
 
ack 0 n = n+1
ack m 0 = ack (m-1) 1
ack m n = ack (m-1) (ack m (n-1))
 
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) + fib (n-2)

Compiling with -threaded and optimizations on:

$ ghc -O2 --make A.hs -threaded -rtsopts
[1 of 1] Compiling Main             ( A.hs, A.o )
Linking A ...

Note that in versions of GHC prior to GHC 7, you can leave off the -rtsopts flag

And now we can run our multicore program. Here across two cores:

$ time ./A +RTS -N2
1405006117752879898543142606244511569936384005711076
./A +RTS -N2  2.14s user 0.02s system 149% cpu 1.449 total

Congratulations! You are now programming your multicore!

[edit] 5 Where to go from here

There are many good Haskell tutorials and books. Here are some we recommend:

Tutorials

For a complete list of textbooks, references and tutorials:

Join the community!

Talk to others in the Haskell community.

Languages: de tur zh/cn zh/tw ja