【发布时间】:2010-07-10 13:22:32
【问题描述】:
我有这个函数(产生斐波那契数列):
unfoldr (\(p1, p2) -> Just (p1+p2, (p1+p2, p1)) ) (0, 1)
在这里,我注意到一个重复的表达式p1+p2,我想将其分解为只计算一次。加法本身并不是一个昂贵的计算,而是一个更通用的版本:
unfoldr (\(p1, p2) -> Just (f p1 p2, (f p1 p2, p1)) ) (0, 1)
where f = arbitrary, possibly time-consuming function
在上述情况下,f p1 p2 被计算了两次(除非有一些我不知道的神奇编译器优化),如果f 需要大量计算,这可能会造成性能瓶颈。我不能将f p1 p2 分解为where,因为p1 和p2 不在范围内。分解此表达式以便 f 只计算一次的最佳方法是什么?
【问题讨论】:
标签: haskell performance evaluation