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

I think the above code would be more efficient written as:

   nth n xs = if n < 0 then Empty else nth' n xs
       where
           nth' 0 (x:_) = Some x
           nth' i (_:xs) = (nth' $! i - 1) xs
           nth' _ _ = Empty

since the first 2 cases deal with every situation where we've got a non-empty list and an index >= 0 (so no need to keep checking that the index is >= 0 in the second case - instead the test can be moved outside the "loop") and there's no need to pattern match against [] in the last case because we already know this must be an empty list. (Though in general it's probably a good idea to make each pattern as independent as possible when writing a function so that if some cases of a function are later edited there's more chance of the compiler being able to lead you to errors via the "incomplete patterns" warning - hopefully the compiler can optimize out any redundant checks)

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