Самое простое решение вашей проблемы - включение оптимизации.
У меня есть ваш источник в файле с именем tail.hs.
jmg$ ghc --make tail.hs -fforce-recomp
[1 of 1] Compiling Main ( tail.hs, tail.o )
Linking tail ...
jmg$ ./tail
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
girard:haskell jmg$ ghc -O --make tail.hs -fforce-recomp
[1 of 1] Compiling Main ( tail.hs, tail.o )
Linking tail ...
jmg$ ./tail
10000000
jmg$
@ Hynek -Pichi- Vychodil
Вышеприведенные тесты проводились на Mac OS X Snow Leopard 64bit с GHC 7 и GHC 6.12.1, каждый в 32-битной версии. После того, как вы понизили голос, я повторил этот эксперимент на Ubuntu Linux со следующим результатом:
jmg@girard:/tmp$ cat length.hs
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]
jmg@girard:/tmp$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.1
jmg@girard:/tmp$ uname -a
Linux girard 2.6.35-24-generic #42-Ubuntu SMP Thu Dec 2 02:41:37 UTC 2010 x86_64 GNU/Linux
jmg@girard:/tmp$ ghc --make length.hs -fforce-recomp
[1 of 1] Compiling Main ( length.hs, length.o )
Linking length ...
jmg@girard:/tmp$ time ./length
Stack space overflow: current size 8388608 bytes.
Use `+RTS -Ksize -RTS' to increase it.
real 0m1.359s
user 0m1.140s
sys 0m0.210s
jmg@girard:/tmp$ ghc -O --make length.hs -fforce-recomp
[1 of 1] Compiling Main ( length.hs, length.o )
Linking length ...
jmg@girard:/tmp$ time ./length
10000000
real 0m0.268s
user 0m0.260s
sys 0m0.000s
jmg@girard:/tmp$
Итак, если вам интересно, мы можем продолжить выяснять, в чем причина, что это не сработало для вас. Я думаю, штаб-квартира GHC приняла бы это как ошибку, если бы в этом случае такая прямая рекурсия по спискам не была оптимизирована в эффективный цикл.