I have defined the following function
let repl x n = [x | _ <- [1..n]]
which imitates the built-in replicate function.
While experimenting with it, I noticed a strange thing: repl 10 0
evaluates to []
, while repl 10 -1
produces an error:
No instance for (Show (t10 -> [t0])) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it
On the other hand, both [1 .. 0]
and [1 .. -1]
evaluate to []
without producing any errors.
Moreover, both [42 | _ <- [1 .. 0]]
and [42 | _ <- [1 .. -1]]
evaluate to []
without errors.
So why does my function call result in an error where the explicit substitution doesn't? And more importantly, where does the apparent difference between [1 .. 0]
and [1 .. -1]
stem from?
And a final question: when I write:
repl 42 -1
the error is exactly the same as with repl 10 -1
, i.e. it still has the (Show (t10 -> [t0]))
bit in it. I was expecting it to have something like ((Show (t42 -> [t0])))
. What's this 10?