title: What’s going on with these Haskell types?
body: <p>Why does this function require a list of integers?</p>
  <pre class="lang-hs prettyprint-override"><code>Prelude&gt; :t \xs-&gt;[(map $ uncurry(*)) (zip xs [1..n]) | n&lt;-[1..(length xs)]]
  \xs-&gt;[(map $ uncurry(*)) (zip xs [1..n]) | n&lt;-[1..(length xs)]]
    :: [Int] -&gt; [[Int]]
  </code></pre>
  <p>When I replace <code>length xs</code> with a fixed value, the type changes and isn’t that strict anymore:</p>
  <pre class="lang-hs prettyprint-override"><code>Prelude&gt; :t \xs-&gt;[(map $ uncurry(*)) (zip xs [1..n]) | n&lt;-[1..100]]
  \xs-&gt;[(map $ uncurry(*)) (zip xs [1..n]) | n&lt;-[1..100]]
    :: (Num b, Enum b) =&gt; [b] -&gt; [[b]]
  </code></pre>
  <p>My compiler is</p>
  <pre><code>$ ghci --version
  The Glorious Glasgow Haskell Compilation System, version 8.8.4
  </code></pre>