我是通过阅读和解决 Project Euler 问题来编程和学习 Haskell 的新手。当然,要提高这些问题的性能,最重要的是使用更好的算法。但是,我很清楚,还有其他简单且易于实施的方法来提高性能。粗略的搜索提出了这个问题和这个问题,它给出了以下提示:
- 使用 ghc 标志 -O2 和 -fllvm。
- 使用 Int 类型而不是 Integer,因为它是未装箱的(甚至是 Integer 而不是 Int64)。这需要键入函数,而不是让编译器即时决定。
- 使用 rem 而不是 mod 进行分区测试。
- 适当时使用Schwartzian 变换。
- 在递归函数中使用累加器(我相信是尾递归优化)。
- 记忆(?)
(一个答案还提到了工人/包装器转换,但这似乎相当先进。)
问题:在 Haskell 中可以进行哪些其他简单的优化来提高 Project Euler 风格问题的性能?是否有任何其他特定于 Haskell(或特定于函数式编程?)的想法或功能可用于帮助加快解决 Project Euler 问题的速度?相反,应该注意什么?有哪些常见但低效的事情需要避免?