Personal tools

Cookbook

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Interactivity)
Current revision (18:49, 26 May 2011) (edit) (undo)
(Added link to similar F# cookbook)
 
(33 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/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]]
-
{{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>
+
-
 
+
-
 
+
-
 
+
-
 
+
-
 
+
-
 
+
-
 
+
-
 
+
-
 
+
-
== Files ==
+
-
 
+
-
=== Reading from a file ===
+
-
The System.IO library contains the functions needed for file IO. The program
+
-
below displays the contents of the file c:\test.txt.
+
-
 
+
-
<haskell>
+
-
import System.IO
+
-
 
+
-
main = do
+
-
h <- openFile "c:\\test.txt" ReadMode
+
-
contents <- hGetContents h
+
-
putStrLn contents
+
-
hClose h
+
-
</haskell>
+
-
 
+
-
The same program, with some higher-lever functions:
+
-
 
+
-
<haskell>
+
-
main = do
+
-
contents <- readFile "c:\\test.txt"
+
-
putStrLn contents
+
-
</haskell>
+
-
 
+
-
=== Writing to a file ===
+
-
 
+
-
The following program writes the first 100 squares to a file:
+
-
<haskell>
+
-
-- generate a list of squares with length 'num' in string-format.
+
-
numbers num = unlines $ take num $ map (show . \x -> x*x) [1..]
+
-
 
+
-
main = do
+
-
writeFile "test.txt" (numbers 100)
+
-
putStrLn "successfully written"
+
-
</haskell>
+
-
 
+
-
This will override the old contents of the file, or create a new file if the file doesn't exist yet. If you want to append to a file, you can use <hask>appendFile</hask>.
+
-
 
+
-
=== Creating a temporary file ===
+
-
 
+
-
TODO
+
-
 
+
-
=== Writing a filter ===
+
-
Using [http://haskell.org/ghc/docs/latest/html/libraries/base/Prelude.html#v:interact interact], you can easily do things with stdin and stdout.
+
-
 
+
-
A program to sum up numbers:
+
-
 
+
-
<haskell>main = interact $ show . sum . map read . lines</haskell>
+
-
 
+
-
A program that adds line numbers to each line:
+
-
 
+
-
<haskell>
+
-
main = interact numberLines
+
-
numberLines = unlines . zipWith combine [1..] . lines
+
-
where combine lineNumber text = concat [show lineNumber, " ", text]
+
-
</haskell>
+
-
 
+
-
=== Logging to a file ===
+
-
 
+
-
TODO
+
-
 
+
-
== 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
+

Current revision

1 Haskell Cookbook

2 Similar projects for other programming languages