The library enables sending and receiving data between different nodes of a distributed Haskell system. This is where the code originated: the [Eden runtime system](http://www.mathematik.uni-marburg.de/~eden/). You might want to read a related paper which describes parts of it ( [IFL 2006](http://www.mathematik.uni-marburg.de/~eden/paper/Eden-IFL06-webversion.pdf) ).
Apart from this obvious application, the functionality can be used to optimise programs by memoisation (across different program runs), and to checkpoint program execution in selected places. Both uses are exemplified in the slide set linked above.
### Drawbacks
As serialisation essentially provides a way to duplicate data (and therefore destroy sharing), certain data should not be serialisable. Most prominently, these include the mutable types `MVar`, `IORef`, and all STM-related types. However, the presence of those types is sometimes not apparent; they occur **within the thunk computing a value of different type**. The most annoying example is lazy file I/O: lazily reading a file entails holding a "half-closed" file handle (essentially an MVar), and will make serialisation fail for the read data.
The ugly solution in the library: the API signals such conditions as exceptions.
Another limitation is that serialised data **can only be used by the very same binary**. This is however common for many approaches to distributed programming using functional languages.
Hans-Wolfgang Loidl introduced me to the GUM packing code, worked with me on the parallel runtime system for a long time, and always provided valuable feedback.
Kevin Hammond is the original author of the packing code used by packman and the Eden RTS. It has been rewritten a few times and improved by a number of people (including Phil Trinder and Hans-Wolfgang Loidl).
Michael Budde and Åsbjørn Jøkladal assembled the first cabalised library version as a student project in our course "Topics in programming languages" 2014 (where the topic was parallel functional programming).