guh*_*hou 5 performance evaluation haskell
我有这个功能(产生斐波纳契序列):
unfoldr (\(p1, p2) -> Just (p1+p2, (p1+p2, p1)) ) (0, 1)
Run Code Online (Sandbox Code Playgroud)
在这里,我注意到一个重复的表达式,p1+p2我想要考虑它,以便它只计算一次.添加本身并不是一个昂贵的计算,但对于更通用的版本:
unfoldr (\(p1, p2) -> Just (f p1 p2, (f p1 p2, p1)) ) (0, 1)
where f = arbitrary, possibly time-consuming function
Run Code Online (Sandbox Code Playgroud)
在上面的情况下,f p1 p2计算两次(除非有一些神奇的编译器优化我不知道),如果f需要大量计算,这可能会产生性能瓶颈.我无法考虑f p1 p2到where因为p1而且p2不在范围内.将此表达式f计算在内的最佳方法是什么,只计算一次?
unfoldr (\(p1, p2) -> let x = f p1 p2 in Just (x, (x, p1)) ) (0, 1)
where f = arbitrary, possibly time-consuming function
Run Code Online (Sandbox Code Playgroud)