Ось проста проблема програмування від SPOJ: http://www.spoj.com/problems/PROBTRES/ .
В основному, вас просять вивести найбільший цикл Колатца для чисел між i і j. (Цикл Колатца з числа $ n $ - це кількість кроків, щоб в кінцевому підсумку отримати від $ n $ до 1.)
Я шукав спосіб Haskell вирішити проблему з порівняльною продуктивністю, ніж у Java або C ++ (так, щоб вписатись у дозволений ліміт часу виконання). Хоча просте рішення Java, яке запам'ятовує довжину циклу будь-яких уже обчислених циклів, буде працювати, я не мав успіху в застосуванні ідеї отримати рішення Haskell.
Я спробував Data.Function.Memoize, а також техніку запам’ятовування домашнього часу, використовуючи ідею з цього посту: /programming/3208258/memoization-in-haskell . На жаль, запам'ятовування насправді робить обчислення циклу (n) ще повільнішим. Я вважаю, що уповільнення відбувається від верхніх шляхів Haskell. (Я спробував запустити компільований двійковий код, а не інтерпретувати.)
Я також підозрюю, що просто повторення чисел від i до j може бути дорогим ($ i, j \ le10 ^ 6 $). Тому я навіть спробував попередньо обчислити все для запиту діапазону, використовуючи ідею з http://blog.openendings.net/2013/10/range-trees-and-profiling-in-haskell.html . Однак це все-таки призводить до помилки "Перевищення обмежень у часі".
Чи можете ви допомогти повідомити про це акуратну конкурентну програму Haskell?