我有这个功能(产生斐波那契数列):
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
只计算一次?