title: Haskell Lazy Evaluation and Reuse
body: <p>I know that if I were to compute a list of squares in Haskell, I could do this:</p>
  
  <pre><code>squares = [ x ** 2 | x &lt;- [1 ..] ]
  </code></pre>
  
  <p>Then when I call squares like this:</p>
  
  <pre><code>print $ take 4 squares
  </code></pre>
  
  <p>And it would print out [1.0, 4.0, 9.0, 16.0]. This gets evaluated as [ 1 ** 2, 2 ** 2, 3 ** 2, 4 ** 2 ]. Now since Haskell is functional and the result would be the same each time, if I were to call squares again somewhere else, would it re-evaluate the answers it's already computed? If I were to re-use squares after I had already called the previous line, would it re-calculate the first 4 values?</p>
  
  <pre><code>print $ take 5 squares
  </code></pre>
  
  <p>Would it evaluate [1.0, 4.0, 9.0, 16.0, 5 ** 2]?</p>