Hi everyone,

i'm trying to understand tail recursion, but im stuck when it comes to tail recursion with tuples. Look at the following source code:

module Main(main) where

    main = do
        putStrLn "tail recursion"
        print $ countOdd2 [0..10000000]
   
    {- Tail recursion doesnt work -}
   
    countOdd :: [Int] -> (Int, Int)
    countOdd lst = countOdd' lst (0,0)
   
    countOdd' :: [Int] -> (Int, Int) -> (Int, Int)
    countOdd' (x:xs) last = if odd x then
                                    countOdd' xs $! (fst last, snd last + 1)
                                else
                                    countOdd' xs $! (fst last + 1, snd last)                                                               
    countOdd' [] last = last
   
    {- Working tail recursion -}
   
    countOdd2 :: [Int] -> Int
    countOdd2 lst = countOdd2' lst 0
   
    countOdd2' :: [Int] -> Int -> Int
    countOdd2' (x:xs) last = if odd x then
                                    countOdd2' xs $! last + 1
                                else
                                    countOdd2' xs last                                                               
    countOdd2' [] last = last

The tail recursion in the function countOdd2 works fine. But it seems not to work in countOdd because i get a Stack space overflow error. Can anyone rewrite countOdd so that it works without a Stack space overflow?

Thank you.

Cheers
Sebastian Arndt