How does Haskell tail recursion work?

Remember that Haskell is lazy. Your computation (l+1) will not occur until it’s absolutely necessary.

The ‘easy’ fix is to use ‘$!’ to force evaluation:

myLength :: [a] -> Integer
myLength xs = len xs 0
where len [] l = l
      len (x:xs) l = len xs $! (l+1)

      main = print $ myLength [1..10000000]

Leave a Comment