...with the term first being introduced to the study of programming languages by Christopher Strachey:
Side effects like (uncontrolled) imperative update break this desirable property. C and ML are languages with constructs that are not referentially transparent.
As an example, consider the following program in ML:
puts "h"; puts "a"; puts "h"; puts "a"
"haha". In an attempt to factor out the repetition, we write
let val x = (puts "h"; puts "a") in x; x end
but now the laugh is on us, because
"ha" is only printed once. The reason is that
puts's side effect is only realized when
x gets bound, so we should have written
let fun x () = (puts "h"; puts "a") in x (); x () end
Haskell's monadic I/O system distinguishes between values and
actions like the
puts procedure above. So we do indeed have that
putStr "h" >> putStr "a" >> putStr "h" >> putStr "a"
is equivalent to
let x = putStr "h" >> putStr "a" in x >> x
 Word and Object, by Willard Van Ormond Quine (page 163 of 314).
 Referential transparency, definiteness and unfoldability, by Harald Søndergaard and Peter Sestoft (page 11 of 13).
 Abstraction as the Key to Programming, with Issues for Software Verification in Functional Languages, by Derek Bronish (pages 113-114 of 211).
 Wolfram Kahl provides a USENET post by Tom DeBoni containing a summary of various definitions for referential transparency.
 Fundamental Concepts in Programming Languages, Christopher Strachey, 1967 (page 9 of 39).
puts can be defined as
fun puts s = output(std_out,s);
 This style of I/O can also be implemented on top of side-effecting I/O: table 9.1 (page 148 of 168) in Andrew Gordon's Functional Programming and Input/Output (the revised 1992 PhD dissertation) provides an example of monadic teletype I/O for ML.
 There is some debate about whether the imprecisely-defined semantics of
Int breaks referential transparency. For instance,
even (maxBound :: Int) may be
True in some contexts and
False in others. Another example is
System.Info.os :: String.
 One perspective is that Haskell is not just one language (plus
Prelude), but a family of languages, parameterized by a collection of implementation-dependent parameters.
Each such language is referentially transparent, even if the collection as a whole might not be.
Some people are satisfied with this situation and others are not.