递归方案是否有一个名字,就像一个变形,但是可以在运行时查看最终结果?这是一个精心设计的示例:
toPercents :: Floating a => [a] -> [a]
toPercents xs = result
where
(total, result) = foldr go (0, []) xs
go x ~(t, r) = (x + t, 100*x/total:r)
{-
>>> toPercents [1,2,3]
[16.666666666666668,33.333333333333336,50.0]
-}
Run Code Online (Sandbox Code Playgroud)
该示例total在折叠的每一步都使用,即使直到结束时才知道其值。(显然,这取决于工作的懒惰。)