Натуральные числа реализованы более оптимально и не переполняют стек:
было - nats = 1 : map (+1) nats
стало - nats = iterate (+1) 1