Difference between revisions of "Cookbook"
Jump to navigation
Jump to search
(Added link to similar F# cookbook) |
|||
(30 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
+ | == Haskell Cookbook == |
||
− | [[Category:How to]] |
||
+ | * [[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]] |
||
* [[Cookbook/Files|Files]] |
* [[Cookbook/Files|Files]] |
||
+ | * [[Cookbook/Network programming|Network programming]] |
||
+ | * [[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]] |
||
+ | == Similar projects for other programming languages == |
||
− | {{Template:Anonymousdraft}} |
||
+ | * [http://cl-cookbook.sourceforge.net/ Common Lisp Cookbook] |
||
− | |||
− | + | * [http://pleac.sourceforge.net/ PLEAC] |
|
+ | * [http://www.zenspider.com/Languages/Ruby/Cookbook/index.html Ruby Cookbook] |
||
− | |||
− | + | * [http://schemecookbook.org/Cookbook/WebHome Scheme Cookbook] |
|
+ | * [http://fssnip.net/ F# Snippets] |
||
− | http://schemecookbook.org/Cookbook/WebHome''' |
||
+ | [[Category:FAQ]] |
||
− | == Prelude == |
||
+ | [[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> |
||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == Network programming == |
||
− | The following example makes use of the Network and System.IO libraries to open |
||
− | a socket connection to Google and retrieve the Google home page. |
||
− | |||
− | <haskell> |
||
− | import Network; |
||
− | import System.IO; |
||
− | |||
− | main = withSocketsDo $ do |
||
− | h <- connectTo "www.google.com" (PortNumber 80) |
||
− | hSetBuffering h LineBuffering |
||
− | hPutStr h "GET / HTTP/1.1\nhost: www.google.com\n\n" |
||
− | contents <- hGetContents h |
||
− | putStrLn contents |
||
− | hClose h |
||
− | </haskell> |
||
− | == XML == |
||
− | === Libraries === |
||
− | There are multiple libraries available. In my own (limited) experience, I could only get [[HXT]] to do everything I wanted. It does make heavy use of [[http://haskell.org/arrows/ Arrows]]. |
||
− | |||
− | === Parsing XML === |
||
− | |||
− | TODO |
||
− | |||
− | == Databases access == |
||
− | There are two packages you can use to connect to MySQL, PostgreSQL, Sqlite3 and ODBC databases: [http://software.complete.org/software/projects/show/hdbc HDBC] and Hsql |
||
− | |||
− | === MySQL === |
||
− | |||
− | TODO |
||
− | |||
− | === PostgreSQL === |
||
− | |||
− | TODO |
||
− | |||
− | === SQLite === |
||
− | Suppose you have created a 'test.db' database like this, |
||
− | |||
− | $ sqlite3 test.db "create table t1 (t1key INTEGER PRIMARY KEY,data TEXT,num double,timeEnter DATE);" |
||
− | |||
− | $ sqlite3 test.db "insert into t1 (data,num) values ('This is sample data',3);" |
||
− | |||
− | $ sqlite3 test.db "insert into t1 (data,num) values ('More sample data',6);" |
||
− | |||
− | $ sqlite3 test.db "insert into t1 (data,num) values ('And a little more',9);" |
||
− | |||
− | Using HDBC and HDBC-sqlite3 packages, you can connect and query it like this: |
||
− | <haskell> |
||
− | import Control.Monad |
||
− | import Database.HDBC |
||
− | import Database.HDBC.Sqlite3 |
||
− | |||
− | main = do conn <- connectSqlite3 "test.db" |
||
− | rows <- quickQuery' conn "SELECT * from t1" [] |
||
− | forM_ rows $ \row -> putStrLn $ show row |
||
− | </haskell> |
||
− | |||
− | |||
− | $ ghc --make sqlite.hs |
||
− | |||
− | $ ./sqlite |
||
− | |||
− | output: |
||
− | |||
− | [SqlString "1",SqlString "This is sample data",SqlString "3.0",SqlNull] |
||
− | |||
− | [SqlString "2",SqlString "More sample data",SqlString "6.0",SqlNull] |
||
− | |||
− | [SqlString "3",SqlString "And a little more",SqlString "9.0",SqlNull] |
||
− | |||
− | == 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
Haskell Cookbook
- Haskell compilers and interpreters
- Numbers
- Lists and strings
- Other data structures
- Dates and time
- Pattern matching
- Interactivity
- Files
- Network programming
- XML
- Databases access
- Graphical user interfaces
- PDF files
- FFI
- Testing