Personal tools

Cookbook

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Databases access)
(Added link to similar F# cookbook)
 
(25 intermediate revisions by one user not shown)
Line 1: Line 1:
[[Category:How to]]
+
== Haskell Cookbook ==
 
+
* [[Cookbook/Compilers and interpreters|Haskell compilers and interpreters]]
* [[Cookbook/Strings|Strings]]
+
 
* [[Cookbook/Numbers|Numbers]]
 
* [[Cookbook/Numbers|Numbers]]
 +
* [[Cookbook/Lists and strings|Lists and strings]]
 +
* [[Cookbook/Other data structures|Other data structures]]
 
* [[Cookbook/Dates And Time|Dates and time]]
 
* [[Cookbook/Dates And Time|Dates and time]]
* [[Cookbook/Lists|Lists]]
 
* [[Cookbook/Other data structures|Other data structures]]
 
 
* [[Cookbook/Pattern matching|Pattern matching]]
 
* [[Cookbook/Pattern matching|Pattern matching]]
 
* [[Cookbook/Interactivity|Interactivity]]
 
* [[Cookbook/Interactivity|Interactivity]]
Line 11: Line 10:
 
* [[Cookbook/Network programming|Network programming]]
 
* [[Cookbook/Network programming|Network programming]]
 
* [[Cookbook/XML|XML]]
 
* [[Cookbook/XML|XML]]
 +
* [[Cookbook/Databases access|Databases access]]
 +
* [[Cookbook/Graphical user interfaces|Graphical user interfaces]]
 +
* [[Cookbook/PDF files|PDF files]]
 +
* [[Cookbook/FFI|FFI]]
 +
* [[Cookbook/Testing|Testing]]
  
{{Template:Anonymousdraft}}
+
== Similar projects for other programming languages ==
 
+
* [http://cl-cookbook.sourceforge.net/ Common Lisp Cookbook]
'''We need to start a Haskell centered cookbook (aka, not a [http://pleac.sourceforge.net/ PLEAC] clone)
+
* [http://pleac.sourceforge.net/ PLEAC]
 
+
* [http://www.zenspider.com/Languages/Ruby/Cookbook/index.html Ruby Cookbook]
This page is based on the Scheme Cookbook at
+
* [http://schemecookbook.org/Cookbook/WebHome Scheme Cookbook]
http://schemecookbook.org/Cookbook/WebHome'''
+
* [http://fssnip.net/ F# Snippets]
== Prelude ==
+
[[Category:FAQ]]
 
+
[[Category:How to]]
A lot of functions are defined in the "[http://www.haskell.org/hoogle/?q=Prelude Prelude]". Also, if you ever want to search for a function, based on the name, type or module, take a look at the excellent [http://www.haskell.org/hoogle/ Hoogle]. This is for a lot of people a must-have while debugging and writing Haskell programs.  
+
 
+
== GHCi/Hugs ==
+
=== GHCi interaction ===
+
To start GHCi from a command prompt, simply type `ghci'
+
 
+
    $ ghci
+
      ___        ___ _
+
      / _ \ /\  /\/ __(_)
+
    / /_\// /_/ / /  | |      GHC Interactive, version 6.6, for Haskell 98.
+
    / /_\\/ __  / /___| |      http://www.haskell.org/ghc/
+
    \____/\/ /_/\____/|_|      Type :? for help.
+
   
+
    Loading package base ... linking ... done.
+
    Prelude>
+
 
+
[http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html Prelude] is the "base" library of Haskell.
+
 
+
To create variables at the GHCi prompt, use `let'
+
<haskell>
+
Prelude> let x = 5
+
Prelude> x
+
5
+
Prelude> let y = 3
+
Prelude> y
+
3
+
Prelude> x + y
+
8
+
</haskell>
+
 
+
`let' is also the way to create simple functions at the GHCi prompt
+
<haskell>
+
Prelude> let fact n = product [1..n]
+
Prelude> fact 5
+
120
+
</haskell>
+
 
+
 
+
=== Checking Types ===
+
To check the type of an expression or function, use the command `:t'
+
<haskell>
+
Prelude> :t x
+
x :: Integer
+
Prelude> :t "Hello"
+
"Hello" :: [Char]
+
</haskell>
+
Haskell has the following types defined in the [http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html Standard Prelude].
+
<haskell>
+
    Int        -- bounded, word-sized integers
+
    Integer    -- unbounded integers
+
    Double      -- floating point values
+
    Char        -- characters
+
    String      -- equivalent to [Char], strings are lists of characters
+
    ()          -- the unit type
+
    Bool        -- booleans
+
    [a]        -- lists
+
    (a,b)      -- tuples / product types
+
    Either a b  -- sum types
+
    Maybe a    -- optional values
+
</haskell>
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
 
+
== Graphical user interfaces ==
+
 
+
=== wxHaskell ===
+
[[WxHaskell|wxHaskell]] is a portable and native GUI library for Haskell based on the wxWidgets Library.
+
 
+
Hello World example:
+
 
+
<haskell>
+
module Main where
+
import Graphics.UI.WX
+
 
+
main :: IO ()
+
main
+
  = start hello
+
 
+
hello :: IO ()
+
hello
+
  = do f    <- frame    [text := "Hello!"]
+
      quit <- button f [text := "Quit", on command := close f]
+
      set f [layout := widget quit]
+
</haskell>
+
 
+
This code was taken from [[WxHaskell/Quick_start | "a quick start with wxHaskell"]].
+
 
+
=== Gtk2Hs ===
+
[http://haskell.org/gtk2hs/screenshots/ Gtk2Hs] is a GUI Library for
+
Haskell based on GTK. [http://home.telfort.nl/sp969709/gtk2hs/ Gtk2Hs Tutorial].
+
 
+
Hello world example:
+
 
+
<haskell>
+
import Graphics.UI.Gtk
+
 
+
main :: IO ()
+
main = do
+
    initGUI
+
    w <- windowNew
+
    b <- buttonNew
+
    set b [buttonLabel := "Quit"]
+
    onClicked b $ widgetDestroy w
+
    set w [windowTitle := "Hello", containerBorderWidth := 10]
+
    containerAdd w b
+
    onDestroy w mainQuit
+
    widgetShowAll w
+
    mainGUI
+
</haskell>
+
 
+
For more examples, see: [[Applications and libraries/Games]]
+
 
+
=== HOpenGL ===
+
[http://www.haskell.org/HOpenGL/ HOpenGL] is a Haskell binding for the OpenGL  graphics API (GL 1.2.1 / GLU 1.3) and the portable OpenGL utility toolkit GLUT.
+
There is a Haskell OpenGL Tetris program at
+
[[http://haskell-tetris.pbwiki.com/Main]] by Jim.
+
 
+
See also: [[Applications and libraries/Games]]
+
 
+
=== SDL ===
+
There are some Haskell bindings to [http://libsdl.org/ SDL] at [http://hackage.haskell.org/packages/archive/pkg-list.html Hackage].
+
 
+
== PDF files ==
+
 
+
For the following recipes you need to install [http://hackage.haskell.org/cgi-bin/hackage-scripts/package/HPDF HPDF].
+
 
+
=== Creating an empty PDF file ===
+
 
+
The following code creates an empty PDF file with the name "test1.pdf":
+
 
+
<haskell>
+
import Graphics.PDF
+
 
+
main :: IO ()
+
main = do
+
  let outputFileName= "test1.pdf"
+
  let defaultPageSize = PDFRect 0 0 200 300
+
 
+
  runPdf outputFileName standardDocInfo defaultPageSize $ do
+
    addPage Nothing
+
</haskell>
+
 
+
=== Pages with different sizes ===
+
 
+
If you pass "Nothing" to the function [http://hackage.haskell.org/packages/archive/HPDF/latest/doc/html/Graphics-PDF-Document.html#v%3AaddPage addPage], the default page size will be used for the size of the new page.
+
 
+
Let’s create three pages, the last two pages with different dimensions:
+
 
+
<haskell>
+
import Graphics.PDF
+
 
+
main :: IO ()
+
main = do
+
  let outputFileName= "test2.pdf"
+
  let defaultPageSize = PDFRect 0 0 200 300
+
 
+
  runPdf outputFileName standardDocInfo defaultPageSize $ do
+
    addPage Nothing
+
    addPage $ Just $ PDFRect 0 0 100 100
+
    addPage $ Just $ PDFRect 0 0 150 150
+
</haskell>
+
 
+
== FFI ==
+
=== How to interface with C===
+
 
+
Magnus has written [http://therning.org/magnus/archives/315 a nice example ] on how to call a C function operating on a user defined type.
+
 
+
== Testing ==
+
 
+
=== QuickCheck ===
+
 
+
TODO
+
 
+
=== HUnit ===
+
 
+
TODO
+

Latest revision as of 18:49, 26 May 2011

[edit] 1 Haskell Cookbook

[edit] 2 Similar projects for other programming languages