Generally, it is the desired effect. In Haskell, it will be reified in an IO action, will appear in type signatures, and - as a value - can be manipulated and combined with similar values. It will only be a side effect if called with unsafePerformIO or similar, and the Haskell community will rightly condemn you for doing so (outside debugging) without a proof for why it's both okay and necessary in this circumstance - relying on side effects means you lose all kinds of guarantees that the type system usually affords you.