Personal tools

Cloud Haskell

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(Videos and Blog Posts)

Revision as of 09:27, 5 November 2012

Cloud Haskell is a domain-specific language for developing programs for a distributed computing environment. Implemented as a shallow embedding in Haskell, it provides a message passing communication model, inspired by Erlang, without introducing incompatibility with Haskell’s established shared-memory concurrency.


1 Availability

Cloud Haskell is available from Hackage as distributed-process. You might also want to install distributed-process-simplelocalnet. The cutting edge development version is on github.

There is also the older prototype implementation remote (also available from github).

2 Documentation

For an overview of Cloud Haskell it's probably a good idea to read Towards Haskell in the Cloud (details below). The relevant documentation (in order of importance is)


If you want to know more details about Closure or Static (without the Template Haskell magic on top) you might want to read

3 Videos and Blog Posts

Cloud Haskell intros

  • blog: A Cloud Haskell Appetiser (Parallel Haskell Digest 11)
  • video: (1hr) Cloud Haskell: a general introduction and tutorial, focusing on what it does and how to use it. It also covers some details about the current implementation.
  • video: (1hr) Towards Haskell in the Cloud: an older but more detailed introduction by Simon Peyton Jones about the problem area and the design decisions and internals of Cloud Haskell. In particular it covers the details of how sending functions over the wire really works.

Well-Typed have a series of blog posts "Communication Patterns in Cloud Haskell"

Alen Ribic has a series of blog posts about (Cloud) Haskell on the Raspberry Pi

Other blog posts

4 Papers

5 Other Useful Packages

5.1 Serializable

A core concept in Cloud Haskell is that of serializable values. The Serializable type class combines Typeable and Binary. ghc can automatically derive Typeable instances for custom data types, but you need a package to derive Binary. There are various packages available that assist with this:

binary-generic and derive have been confirmed to work with Cloud Haskell; the status of the other packages is unknown -- YMMV (please feel free to update this wiki page if you have more information).

6 Migration from remote

Here are some suggestions that might ease the migration from the Cloud Haskell prototype remote to distributed-process.

  • The "implicit" type of mkClosure has changed (implicit because mkClosure is a Template Haskell function). In distributed-process mkClosure takes a function of type T1 -> T2 and returns a function of type T1 -> Closure T2. In other words, the first argument to your function becomes the closure environment; if you want two items in your closure environment, create a function of type (T1, T2) -> T3; if you want none, create a function of type () -> T1.
  • distributed-process follows the naming conventions in Towards Haskell in the Cloud rather than in remote so the functions that deal with typed channels are called sendChan, receiveChan and newChan instead of sendChannel, receiveChannel and newChannel.
  • sendChan, receiveChan (and send) never fail in distributed-process (in remote they might throw a TransmitException). Instead, if you want to be notified of communication failure, you need to use monitor or link.
  • The function forkProcess in remote is called spawnLocal in distributed-process
  • The Process monad is called Process in distributed-process (rather than ProcessM). Similarly, the type Match replaces MatchM (and is no longer a monad).
  • Initialization is different. See the documentation of of the Control.Distributed.Process.SimpleLocalnet to get started (note that the master/slave distinction in SimpleLocalnet is optional and does not need to be used).
  • Peer discovery is different. The functions getPeers and nameQuery are no longer available. The function findPeers from SimpleLocalnet replaces some, but not all, of the functionality of getPeers. You can use whereisRemoteAsync to find processes that have been registered by name.