Because unsafePerformIO returns a pure value 'a', GHC only computes it once and then reuses it later (it's also why when you do this you need to make sure you tell GHC not to inline the computation, which will obviously change the semantics.) Cheers, Edward