The Weak
library provides a "weak pointer" abstraction, giving
the user some control over the garbage collection of specified
objects, and allowing objects to be "finalized" with an arbitrary
Haskell IO computation when they die.
Weak pointers partially replace the old foreign object interface, as we will explain later.