Простые советы по повышению производительности Haskell (при решении задач ProjectEuler )?

Я новичок в программировании и изучаю Haskell, читая и решая задачи Project Euler. Конечно, самое важное, что можно сделать для повышения производительности при решении этих задач, — это использовать более совершенный алгоритм. Однако мне ясно, что есть и другие простые и легкие в реализации способы повышения производительности. Беглый поиск выявил этот вопрос и этот вопрос , которые дают следующие советы:

  • Используйте флаги ghc -O2 и -fllvm.
  • Используйте тип Int вместо Integer, потому что он не упакован (или даже Integer вместо Int64 ). Это требует ввода функций, не позволяя компилятору решать на лету.
  • Используйте rem, а не mod, для тестирования разделения.
  • При необходимости используйте преобразования Шварца .
  • Использование аккумулятора в рекурсивных функциях (оптимизация хвоста -рекурсии, я полагаю ).
  • Запоминание (?)

(В одном ответе также упоминается преобразование рабочего/оболочки, но это кажется довольно продвинутым.)

Вопрос:Какие еще простые оптимизации можно сделать в Haskell для повышения производительности при решении задач в стиле Project Euler -? Существуют ли какие-либо другие особенности Haskell -(или функционального программирования? )идеи или функции, которые можно использовать для ускорения решения задач Project Euler? И наоборот, чего следует остерегаться? Каких распространенных, но неэффективных вещей следует избегать?

9
задан Community 23 May 2017 в 12:01
поделиться