Brian Hulley wrote:
Brian Hulley wrote:
Brian Hurt wrote:
nth 0 (x:xs) = Some x
nth i (x:xs) = if i < 0 then Empty else nth (i-1) xs
nth i [] = Empty
[blows stack on large i]

As other people have pointed out, this is due to laziness. I'd write
it like:

   nth 0 (x:_) = Some x
   nth i (_:xs) = of i < 0 then Empty else (nth $! i-1) xs
                          ^^^ -- oops!

   nth _ [] = Empty

Actually I see I should have read Jeremy Shaw's answer more carefully before giving my own since I'd missed the point about the problem being with the list itself not the decrementing of (i) (which wouldn't be a problem since it is immediately forced on the next iteration by the comparison of i to 0).

The answer therefore lies in the laziness of the makelist function which could be solved by:

   makelist i = i : (makelist $! i - 1)

Jeremy Shaw wrote:
pps. I didn't explain why [1..1000000] works, but [1..] fails, because
I don't know :) It's a bit suprising to me...

I think this might be because the code that produces the list [1..1000000] would have to be something like:

   produce n i = if i < n then i : produce n (i +1) else []

so each element of the list is now forced by the comparison with n, so even though the end of the list will be a thunk when 1000000 has not yet been reached, none of the elements are thunks.

Anyway it was certainly not a "stupid" question - thanks for asking it.

Best regards, Brian.
--
http://www.metamilk.com
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to