Я заметил эту идиому в Data.Unique :
uniqSource :: TVar Integer uniqSource = unsafePerformIO (newTVarIO 0) {-# NOINLINE uniqSource #-}
Гарантированно ли он запускается только один раз?