Difference between revisions of "How to write a Haskell program"

From HaskellWiki
Jump to navigation Jump to search
(typo)
m (point out that LGPL advice is controversial)
Line 9: Line 9:
 
== Licenses ==
 
== Licenses ==
   
Library code for the base libraries must be BSD licensed. Otherwise, it
+
Code for the common base library package must be BSD licensed. Otherwise, it
  +
is entirely up to you as the author.
is your call. Choose a licence (inspired by [http://www.dina.dk/~abraham/rants/license.html this]).
+
Choose a licence (inspired by [http://www.dina.dk/~abraham/rants/license.html this]).
Check licence of things you use, both other Haskell packages and C
+
Check the licences of things you use, both other Haskell packages and C
libraries. Use same as related where possible. Haskell community is
 
  +
libraries, since these may impose conditions you must follow.
 
Use the same licence as related projects, where possible. The Haskell community is
 
split into 2 camps, roughly, those who release everything under BSD, and
 
split into 2 camps, roughly, those who release everything under BSD, and
GPLers. We recommend avoiding LGPL, due to cross module optimisation
+
(L)GPLers. Some Haskellers recommend avoiding LGPL, due to cross module optimisation
  +
issues. Like many licensing questions, this advice is controversial. Several Haskell projects
issues.
 
  +
(wxHaskell, HaXml, etc) use the LGPL with an extra permissive clause which gets round the
  +
cross-module optimisation thing.
   
 
== Revision control ==
 
== Revision control ==

Revision as of 14:03, 31 October 2006

A guide to the best practice for creating a new Haskell project or program.

Structure

The basic structure of a new Haskell project can be adopted from HNop, the minimal Haskell project.

Licenses

Code for the common base library package must be BSD licensed. Otherwise, it is entirely up to you as the author. Choose a licence (inspired by this). Check the licences of things you use, both other Haskell packages and C libraries, since these may impose conditions you must follow. Use the same licence as related projects, where possible. The Haskell community is split into 2 camps, roughly, those who release everything under BSD, and (L)GPLers. Some Haskellers recommend avoiding LGPL, due to cross module optimisation issues. Like many licensing questions, this advice is controversial. Several Haskell projects (wxHaskell, HaXml, etc) use the LGPL with an extra permissive clause which gets round the cross-module optimisation thing.

Revision control

Use Darcs unless you have a specific reason not to. Almost all new Haskell projects are released under Darcs, and this benefits everyone -- a set of common tools increases productivity, and you're more likely to get patches.

Advice:

  • Tag each release
  • Make sure you also release tarballs, darcs dist can do this automatically

Hosting

A Darcs repository can be publised simply by making it available from a web page. If you prefer not to do this yourself, source can be hosted on darcs.haskell.org (currently you need to email Simon Marlow to do this). Also, haskell.org itself has some user accounts available. Finally, there is SourceForge and other online/free sites.

Web page

Create a web page documenting your project! An easy way to do this is to add a project specific page to the Haskell wiki

Build system

Use Cabal.

Example Setup

Create a file called Setup.lhs with these contents:

#!/usr/bin/env runhaskell

> import Distribution.Simple
> main = defaultMain

Writing the setup file this way allows it to be executed directly by unix shells.

Example cabal file for Executables

Create the file myproject.cabal following this example:

Name:           MyProject
Version:        0.1
License:        BSD3
Author:         Your Name
Build-Depends:  base
Synopsis:       Example Cabal Executable File

Executable:     myproj
Main-Is:        Main.hs
Other-Modules:  Foo

Example cabal file for Libraries

Create the file myproject.cabal following this example:

Name:           MyProj
Version:        0.1
License:        BSD3
Author:         Your Name
Build-Depends:  base
Synopsis:       Example Cabel Library File
Exposed-Modules: MyProject.Foo

Documentation

Use Haddock.

Testing

Pure code can be tested using QuickCheck or SmallCheck. Impure code with HUnit.

To get started try, Introduction to QuickCheck. For a slightly more advanced introduction, here is a blog article about creating a testing framework for QuickCheck using some Template Haskell, Simple Unit Testing in Haskell.

Program structure

Monad transformers are very useful for programming in the large, encapsulating state, and controlling side effects. To learn more about this approach, try Monad Transformers Step by Step.

Publicity

The best code in the world is meaningless if nobody knows about it:

  • Announce your project releases to haskell@haskell.org! This ensure it will then make it into the Haskell Weekly News. To be doubly sure, you should CC the release to the HWN editor
  • Blog about it, on Planet Haskell
    • Write about it on your blog
    • Then email the Planet Haskell maintainer (ibid on #haskell) the RSS feed url for your blog
  • Add your library or tool to the Libraries and tools page, under the relevant category, so people can find it.