Aqui está um simples problema de programação do SPOJ: http://www.spoj.com/problems/PROBTRES/ .
Basicamente, você é solicitado a produzir o maior ciclo de Collatz para números entre iej. (O ciclo de Collatz de um número $ n $ é o número de etapas para, eventualmente, passar de $ n $ a 1.)
Eu estava procurando uma maneira Haskell de resolver o problema com desempenho comparativo do que o Java ou C ++ (para se encaixar no limite de tempo de execução permitido). Embora uma solução Java simples que memorize a duração do ciclo de qualquer ciclo já calculado funcione, não tive êxito em aplicar a ideia de obter uma solução Haskell.
Eu tentei o Data.Function.Memoize, bem como a técnica de memorização de tempo de registro feita em casa, usando a ideia desta publicação: /programming/3208258/memoization-in-haskell . Infelizmente, a memorização realmente torna o cálculo do ciclo (n) ainda mais lento. Eu acredito que a desaceleração vem do alto do caminho Haskell. (Tentei executar com o código binário compilado, em vez de interpretar.)
Eu também suspeito que simplesmente iterar números de i a j pode ser caro ($ i, j \ le10 ^ 6 $). Então, tentei pré-calcular tudo para a consulta de intervalo, usando a idéia de http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . No entanto, isso ainda dá o erro "Tempo limite excedido".
Você pode ajudar a informar um bom programa Haskell competitivo para isso?