|
|
| (24 intermediate revisions 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/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
| + | |