如何将此Haskell表达式考虑在内以避免重复计算?

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 p2where因为p1而且p2不在范围内.将此表达式f计算在内的最佳方法是什么,只计算一次?

sep*_*p2k 9

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)